leetcode 761. Special Binary String

Posted SJY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 761. Special Binary String相关的知识,希望对你有一定的参考价值。

761. Special Binary String

题意:

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

思路:

我们可以将1看作是上升,0是下降,那么可以这样
技术分享图片

然后我们可以找最外层符合要求的子串也就是最底部从水平线开始又降到水平线的段,可以发现找这样的串只要统计一个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\n",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;
    }
};

以上是关于leetcode 761. Special Binary String的主要内容,如果未能解决你的问题,请参考以下文章

leetcode893. Groups of Special-Equivalent Strings

LeetCode --- 1582. Special Positions in a Binary Matrix 解题报告

LeetCode --- 1582. Special Positions in a Binary Matrix 解题报告

LeetCode笔记:Biweekly Contest 76

LeetCode.893-特殊相等字符串组(Groups of Special-Equivalent Strings)

LeetCode --- 1608. Special Array With X Elements Greater Than or Equal X 解题报告