题目来源
题目描述
class Solution {
public:
string makeLargestSpecial(string s) {
}
};
题目解析
题意
我们可以把特殊的二进制序列看作“有效的括号”,1表示左括号,0表示右括号
- 0的数量与1的数量相等:左右括号数量相等
- 二进制序列的每一个前缀码中1的数量要大于等于0的数量,代表有效的括号:每一个左括号都有右括号匹配,并且左括号在前
比如:“11011000"可以看作”(()(()))"。
两个连续且非空的特殊的子串,然后将它们交换,代表交换两个相邻的有效括号
递归
思路
- 把每一个有效的括号匹配都看作一部分,然后进行排序,内部也进行排序处理,例如
- 这种特点天然适合递归的思路,先递归到最里层,然后一层一层向外扩展,直至完成所有的排序。
class Solution {
public:
string makeLargestSpecial(string str) {
int cnt = 0, i = 0;
vector<string> v;
string res = "";
for (int j = 0; j < str.size(); ++j) {
cnt += (str[j] == '1') ? 1 : -1;
if (cnt == 0) {
v.push_back('1' + makeLargestSpecial(str.substr(i + 1, j - i - 1)) + '0');
i = j + 1;
}
}
sort(v.begin(), v.end(), greater<string>());
for (i = 0; i < v.size(); ++i) res += v[i];
return res;
}
};