761.特別なバイナリシーケンス
特別なバイナリシーケンスは、次の2つのプロパティを持つバイナリシーケンスです。
0の数は1の数と同じです。
バイナリシーケンスの各プレフィックスの1の数は0以上でなければなりません。
文字列として表現される特別なバイナリシーケンスSが与えられます。最初にSの2つの連続した空でない特別な部分文字列を選択し、次にそれらを交換する操作を定義します。(2つの部分文字列は、最初の部分文字列の最後の文字が2番目の部分文字列の最初の文字の直前にある場合に限り、連続しています。)
任意の数の操作の後、辞書式順序で交換された文字列の最大の結果は何ですか?
例1:
入力:S = "11011000"
出力: "11100100"
説明:
サブストリング "10"(S [1]に表示)と "1100"(S [3]に表示)を交換します。
これは、いくつかの操作の後の辞書式順序での最大の結果です。
説明:
Sの長さは50を超えません。
Sは、上記の定義を満たす特別なバイナリシーケンスであることが保証されています。
PS:
既然是01子串,为什么不当成括号处理呢?
class Solution {
public String makeLargestSpecial(String S) {
StringBuilder sb = new StringBuilder();
List<String> list = new ArrayList<>();
int start = 0;
int countOne = 0;
for(int i = 0; i < S.length(); ++i) {
countOne += S.charAt(i) == '1' ? 1 : -1;
if(countOne == 0) {
String str = S.substring(start + 1, i);
list.add("1" + makeLargestSpecial(str) + "0");
start = i + 1;
}
}
Collections.sort(list);
for(int i = list.size() - 1; i >= 0; --i)
sb.append(list.get(i));
return sb.toString();
}
}