zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    asp中动态include的方法
    asp存储过程使用大全
    用vb6写asp组件的简单例子
    asp中遍历一些对象(request,session,Application)
    查看ASP Session 变量的小工具
    层不能跨框架(包括TEXTAREA)显示的解决办法
    保存远程图片到本地 同时取得第一张图片并创建缩略图
    使用.Net开发asp组件
    使用ASP在IIS创建WEB站点
    解析notes自带的rtf javaapplet编辑器
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/8260854.html
Copyright © 2011-2022 走看看