lc 761. Special Binary String

https://leetcode.com/problems/special-binary-string/description/

 

符合两个规则的01字符串称为s串:

1.   0和1的数量相同

2.  任意前缀0不能多于1

 

其实这样子限制的是一个合法嵌套括号。

然后,要求的是,相邻的子s串可以换位置,让你输出字典序最大的交换结果。

 

发现规律:

只要给定串是s串,那么

任何1开始都能开启一段s串

s串的关系只有两种,相邻和嵌套。

现在的问题是,在做分析的时候,一个从1开始的字串是选最长的还是最短?

答案:选最短!

选最短就保证了寻找所有可能,而已若a是最短字串,那么a必须以1开始以0结尾,把这两段去除后里面要不就是空,要不就是若干s串相邻。

对于这种嵌套,递归的做可以。因为不相邻的不能交换,那么就不用考虑outside的情况了。

有个小语法,list的倒置是list[::-1]第三个参数是步长,所以取-1正好。

code:

class Solution:
    def makeLargestSpecial(self, S):
        count = i = 0
        res = []
        for j, v in enumerate(S):
            count = count + 1 if v == '1' else count - 1
            if count == 0:
                res.append('1' + self.makeLargestSpecial(S[i + 1:j]) + '0')
                i = j + 1
        return ''.join(sorted(res)[::-1])
View Code

 

posted @ 2018-09-11 16:03  Cloud.9  阅读(165)  评论(0编辑  收藏  举报