ここでのオリジナルタイトルリンク:https://leetcode.com/problems/remove-all-adjacent-duplicates-in-string-ii/
トピック:
文字列を与えられ s
、 K 重複除去は 選択から構成 k
から隣接と同じ文字を s
、左と一緒に連結するサブストリング削除の右側を引き起こすそれらを除去します。
私たちは、繰り返し行うこと k
で、重複削除を s
、私たちはもはやことができるまで。
このようなすべての重複削除が行われた後、最終的な文字列を返します。
答えが一意であることが保証されています。
例1:
入力:S =は、K = 2 "ABCD" "ABCD":出力は、 削除するものは何もありません:説明。
例2:
入力:S = "deeedbbcccbdaa"、K = 3 出力: "AA" 説明: 最初に"ddbbbdaa"を取得し、 "EEE"と"CCC"を削除 "dddaa"を取得し、その後削除"BBB" を取得、最後に"DDD"を削除」 AA」
例3:
入力:S = "pbbcggttciiippooaais"、K = 2 出力: "PS"
制約:
1 <= s.length <= 10^5
2 <= k <= 10^4
s
唯一の小文字の英文字が含まれています。
ソリューション:
我々は真のように変更、削除、マークを持っている場合、指示に従って、重複を削除します。
変更は事実ですが、続けています。
時間複雑度:はO(n ^ 2 / K - N)。N = s.length()。各レベルは、SがNになる - K、完全にN / k個のレベルが存在します。
スペース:O(n)を。
ACのJava:
1 クラスソリューション{ 2 パブリック文字列removeDuplicates(文字列s、int型K){ 3 であれば(S == NULL || s.length()== 0 ){ 4 リターンS。 5 } 6 7 場合(K == 1 ){ 8 リターン "" 。 9 } 10 11 ブール変化= 真。 12 一方(変更){ 13 =変更偽。 14 StringBuilderのSB = 新しいStringBuilderの(); 15 16 INT I = 0 。 17 一方(I < s.length()){ 18 であれば(I == s.length() - 1 || s.charAt(I)= s.charAt(I + 1] )){ 19 sb.append( s.charAt(I)); 20 I ++ ; 21 } 他{ 22 のint J = I + 1 。 23 int型のカウント= 1 ; 24 一方(== s.charAt(I)&&カウント<J <s.length()&& s.charAt(J){K) 25 J ++ ; 26 数++ ; 27 } 28 29 であれば(数< K){ 30 sb.append(s.substring(I、J))。 31 } 他{ 32が 変化= 真。 33 } 34 35 iが= J。 36 } 37 } 38個の 39 S = sb.toString()。 40 } 41 42 リターンS。 43 } 44 }