• leetcode 761. Special Binary String


    761. Special Binary String

    题意:

    一个符合以下两个要求的二进制串:
    (1.串中包含的1和0的个数是相等的。)
    (2.二进制串的所有前缀中1的个数不少于0的个数)
    被称为特殊二进制串
    要求我们任意交换两个相邻的特殊二进制串(可以交换任意次)使得最终得到的序列的字典序最大,并且满足是特殊二进制串。

    思路:

    我们可以将1看作是上升,0是下降,那么可以这样
    图片来之leetcode题解

    然后我们可以找最外层符合要求的子串也就是最底部从水平线开始又降到水平线的段,可以发现找这样的串只要统计一个cnt变量,然后cnt第一次从1变到0就可以找到一段。我们发现这些端除去首首尾,‘1’+str+‘0’,那么我们证明str是以1开头和0结尾的特殊串假设str以1结尾那么‘1’+str 的cnt计数为1,那么去除str最后的1,cnt = 0,那么与选择的串为第一个cnt=0不符,那么假设str首个为0,那么10为第一个cnt = 0所选的字段与当前不符,又前特殊串前后剥去1,0不改变特殊性。
    那些段就可以看成是原问题的一个子问题,所以我们就可以递归处理了。由于交换特殊串的时候串的前缀和始终满足要求,所以只要sort下就可以了。

    题链

    代码:

    class Solution
    {
    public:
        string makeLargestSpecial(string S)
        {
            int len = S.length();
            int cnt = 0;
            vector<string>str;
            int pr = 0;
            for(int i = 0;i < len ;i++)
            {
                if(S[i] == '1')
                    cnt++;
                else cnt--;
                if(cnt==0)
                {   //printf("%d
    ",i);
                    str.push_back('1' + makeLargestSpecial(S.substr(pr+1,i-pr)) + '0');
                    pr = i+1;
                }
                
            }
            sort(str.begin(),str.end(),cmp);
                string ask = "";
            for(int i = 0;i < str.size();i++)
                ask += str[i];
            return ask;
        }
        static bool cmp(string a,string b)
        {
            return a > b;
        }
    };
    
  • 相关阅读:
    hilla 项目基本结构
    dremio 的配置管理简单说明
    基于jackson 多态数据类型处理rest api 业务
    dremio SourceMetadataManager 服务简单说明
    hilla 框架的组成
    dremio jdbc arp 扩展包装以及加载处理
    krakend 2.0.0 发布了
    lightdash 运行简单说明
    dremio 源码分析学习的几个方便工具
    dremio 社区版本scheduler 任务池加载处理机制简单说明
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/8260854.html
Copyright © 2020-2023  润新知