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 = 0res = []for j, v in enumerate(S):count = count + 1 if v == '1' else count - 1if count == 0:res.append('1' + self.makeLargestSpecial(S[i + 1:j]) + '0')i = j + 1return ''.join(sorted(res)[::-1])