LeetCode 761特殊バイナリシーケンスのJava実装(ブラケット問題)

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();
    }
}
1,830件のオリジナル記事を公開 30,000以上の賞賛 486万回の再生

おすすめ

転載: blog.csdn.net/a1439775520/article/details/105555913