Special Binary String

hard strings recursion greedy

Problem

A special binary string has equal numbers of 0s and 1s and every prefix has at least as many 1s as 0s. Repeatedly swap adjacent special substrings to produce the lexicographically largest possible string.

Inputs='11011000'
Output'11100100'
Swap the substrings '011' and '10' to maximize.

def makeLargestSpecial(s):
    count = i = 0
    parts = []
    for j, c in enumerate(s):
        count += 1 if c == '1' else -1
        if count == 0:
            parts.append('1' + makeLargestSpecial(s[i+1:j]) + '0')
            i = j+1
    parts.sort(reverse=True)
    return "".join(parts)
function makeLargestSpecial(s) {
  let count = 0, i = 0;
  const parts = [];
  for (let j = 0; j < s.length; j++) {
    count += s[j] === '1' ? 1 : -1;
    if (count === 0) {
      parts.push('1' + makeLargestSpecial(s.slice(i+1, j)) + '0');
      i = j+1;
    }
  }
  parts.sort().reverse();
  return parts.join("");
}
String makeLargestSpecial(String s) {
    int count = 0, i = 0;
    List<String> parts = new ArrayList<>();
    for (int j = 0; j < s.length(); j++) {
        count += s.charAt(j) == '1' ? 1 : -1;
        if (count == 0) {
            parts.add("1" + makeLargestSpecial(s.substring(i+1, j)) + "0");
            i = j+1;
        }
    }
    parts.sort(Comparator.reverseOrder());
    StringBuilder sb = new StringBuilder();
    for (String p : parts) sb.append(p);
    return sb.toString();
}
string makeLargestSpecial(string s) {
    int count = 0, i = 0;
    vector<string> parts;
    for (int j = 0; j < (int)s.size(); j++) {
        count += s[j] == '1' ? 1 : -1;
        if (count == 0) {
            parts.push_back("1" + makeLargestSpecial(s.substr(i+1, j-i-1)) + "0");
            i = j+1;
        }
    }
    sort(parts.begin(), parts.end(), greater<string>());
    string out;
    for (auto& p : parts) out += p;
    return out;
}
Time: O(n^2) Space: O(n)