• 【字符串】特殊的二进制序列 递归+排序


    题目描述

    特殊的二进制序列是具有以下两个性质的二进制序列:

    • 0和1的数量相等;
    • 二进制序列的每一个前缀码中1度数量都大于等于0。

    在给定一个特殊的二进制序列S时;可以对S内部的特殊子串做交换,在多次交换后返回字典顺序最大的特殊子串。

    示例1:

    输入: S = "11011000"
    输出: "11100100"

    解题思路 

    这道题读题就需要理解很久,实际上特殊二进制序列就是,0和1组成的字符串,并且0和1的个数相等,并且从左向右数1的个数一直大于等于0的个数。这样第一个字符必然是1最后一个字符必然是0.

    这道题解法:

    • 针对字符串"11011000"按照第一个字符是1,最后一个字符是0进行拆解,第一层拆解成'1' + "101100" + '0';
    • 接着针对字符串"101100"进行拆解拆解成,"10" + "1100"; 
    • 以此类推,每层拆解的结果放到集合里面,每层做倒序排列;
    • "10" + "1100" 排序后得到:"1100"+ "10";
    • 最后返回字符串:11100100。

    代码实现

    1. import java.util.ArrayList;
    2. import java.util.Collections;
    3. import java.util.Comparator;
    4. import java.util.List;
    5. class Solution {
    6. public String makeLargestSpecial(String s) {
    7. int length = s.length();
    8. if (length <= 2) {
    9. return s;
    10. }
    11. int count = 0;
    12. int start = 0;
    13. List list = new ArrayList<>();
    14. for (int i = 0; i < length; i++) {
    15. if (s.charAt(i) == '1') {
    16. ++count;
    17. } else {
    18. if (--count == 0) {
    19. // case1. 注意递归
    20. list.add('1' + makeLargestSpecial(s.substring(start + 1, i)) + '0');
    21. // case2. 注意下一次的start
    22. start = i + 1;
    23. }
    24. }
    25. }
    26. // 对数据进行倒序
    27. Collections.sort(list, new Comparator() {
    28. @Override
    29. public int compare(String o1, String o2) {
    30. return o2.compareTo(o1);
    31. }
    32. });
    33. // 重新拼接结果
    34. StringBuilder res = new StringBuilder(length);
    35. for (String l : list) {
    36. res.append(l);
    37. }
    38. return res.toString();
    39. }
    40. public static void main(String[] args) {
    41. Solution solution = new Solution();
    42. System.out.println(solution.makeLargestSpecial("11011000"));
    43. }
    44. }

     总结

    这道题实际就是一个不断拆解的问题,但找到这个规律不太容易,我是查看了其他人的分析思路后才能基本理解思路。如果换一类题可能又会忘记做法,这类题只能自己再多加练习了。如果有更好的解法或者类似的题目欢迎回复,大家一起进步。

     

  • 相关阅读:
    jar包运行报错jar中没有主清单属性、springGateway访问接口报错302,跳转login接口
    OpenCV图像处理学习十三,图像金字塔——高斯金字塔和拉普拉斯金字塔
    第三方bean使用ConfigurationProperties注解获取yml配置文件数据 & 获取yml配置文件数据的校验
    设计模式桥接模式
    Transformer 模型中常见的特殊符号
    Manjaro如果yay使用了aur的清华源,出现报错,解决方法
    微服务——Ribbon的两三事
    django的orm框架基础使用
    系统测试-从研发到测试过程
    React 中的 Solidity 和 Ethereum (Next JS):完整指南
  • 原文地址:https://blog.csdn.net/weiliuhong1/article/details/126239148