文字列内の隣接する重複をすべて削除します
小文字の文字列が指定されたS
場合、重複削除操作では、隣接する同一の2つの文字が選択され、それらが削除されます。
でS
削除されるまで繰り返され、重複削除の実装、我々は続行できません。
すべての重複排除操作が完了した後、最終的な文字列を返します。答えは一意であることが保証されています。
例
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
プロンプト
1 <= S.length <= 20000
S
英小文字のみで構成されています。
問題解決のアイデア
N番目(N> 1)の文字の処理方法:
- S [N] == S [N + 1]の場合
- S [N]とS [N + 1]は重複しており、クリアする必要があります
- S [N + 2]がS [N-1]と等しいかどうかを判別します。これらが等しい場合、重複は引き続きクリアされます。等しくない場合は、N + 2番目の文字列から最善の判断を続けます
- S [N]!= S [N + 1]の場合
- N + 1番目の文字から判断し続ける
N + 2とN-1が境界を越えるかどうかを適切に判断する必要がある
ソリューションJAVAの実装
public String removeDuplicates(String S) {
if (S.length() <= 0) {
return "";
}
Deque deque = new ArrayDeque<>();
char[] charArray = S.toCharArray();
deque.addLast(charArray[0]);
for (int i = 1; i < charArray.length; i++) {
if (!deque.isEmpty() && deque.peekLast().equals(charArray[i])) {
deque.pollLast();
continue;
} else {
deque.addLast(charArray[i]);
}
}
StringBuilder result = new StringBuilder();
while (!deque.isEmpty()) {
result.append(deque.pollFirst());
}
return result.toString();
}