1047.文字列内の隣接する重複をすべて削除する(文字列内の隣接する重複をすべて削除する)| LeetCode質問1047

文字列内の隣接する重複をすべて削除します

クリックしてLeetCodeを入力してください

小文字の文字列が指定されたS場合、重複削除操作では、隣接する同一の2つの文字が選択され、それらが削除されます。
S削除されるまで繰り返され、重複削除の実装、我々は続行できません。
すべての重複排除操作が完了した後、最終的な文字列を返します。答えは一意であることが保証されています。

输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"

プロンプト

  1. 1 <= S.length <= 20000
  2. S 英小文字のみで構成されています。

問題解決のアイデア

N番目(N> 1)の文字の処理方法:

  • S [N] == S [N + 1]の場合
    1. S [N]とS [N + 1]は重複しており、クリアする必要があります
    2. 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();
}
元の記事を7件公開 3を獲得 ビュー315

おすすめ

転載: blog.csdn.net/sl285720967/article/details/103135063