LeetCodeは重複する文字を削除します(316の質問)

LeetCodeは重複する文字を削除します(316の質問)

@author:Jingdai
@date:2020.10.27

トピックの説明(316の質問)

ここでは文字列でs、各文字は一度だけ表示されるように、文字列内の繰り返し文字を削除してください。返される結果が辞書式に最小になるようにするために必要です(要求によって他の文字の相対位置が乱れることはありません)。

  • サンプル入力
s = "bcabc"
  • サンプル出力
"abc"
  • 促す
s 由小写英文字母组成

アイデア

一見、トピックは非常に単純だと思うかもしれませんが、それだけが重要なのではありません。しかし、よく見ると、そうではないことがわかります。タイトルの難しさは、重複を完全に取り除くことではなく、辞書式順序を最小限に抑えると同時に、他の文字の位置を乱さないことです。

辞書式順序で最小になるように、KビットデジタルLeetCodeと同様に、明確な変位(質問402)、push新しい文字の前にあるスタックの使用、前の文字が実際よりも大きいことを確認してください。大きい、それからpop手紙の前、それが今のところ小さいより前の手紙、そしてpush現在の手紙まで。

これにより、辞書式順序が最小になりますが、新しい問題が発生する可能性popがありますpopこれにより、最後の文字列がこの文字を実行するようになります。直接ではありません私は何をすべきか?万一pop無い検査前の文字の後に同じ、もしあれば、その後、popあなたは最終的には手紙を失われないことを保証することができますので、。これは、最小注文を保証するだけでなく、手紙が紛失しないことも保証します。

次に、質問が再び来ます。後ろに同じ文字があるかどうかをどうやって知るのですか?これは非常に単純です。明示的に記述sされたタスクは小文字で構成されているため、配列26は長さの文字数で記録される可能性があり、対応する配列の文字の場合、アルファベットの各文字にトラバースすると数値から1が差し引かれます。数字は0で、フォローされていないことをpop示します。それ以外の場合は、安全に背後にある可能性があることを示しますpop

ああ、そして最後に重複を削除する最も簡単な方法を忘れました。これは扱いが簡単です。文字がスタックにあるかどうかを記録するために配列を使用するだけです。文字がすでにスタックにある場合は、文字をスキップしてください。コードは以下のように表示されます。

コード

public String removeDuplicateLetters(String s) {
     
     

    int[] letterArray = new int[26];

    for (int i = 0; i < s.length(); i++) {
     
     
        letterArray[s.charAt(i) - 'a']++;
    }

    boolean[] isInStack = new boolean[26];
    LinkedList<Character> stack = new LinkedList<>();

    for (int i = 0; i < s.length(); i++) {
     
     
        char tempChar = s.charAt(i);
        letterArray[tempChar - 'a']--;
        if (isInStack[tempChar - 'a']) {
     
     
            continue;
        }
        while (stack.size() != 0 && tempChar < stack.peek()) {
     
     
            if (letterArray[stack.peek() - 'a'] > 0 ) {
     
     
                isInStack[stack.pop() - 'a'] = false;
            } else {
     
     
                break;
            }
        }
        isInStack[tempChar - 'a'] = true;
        stack.push(tempChar);
    }

    StringBuilder ans = new StringBuilder();
    while (stack.size() != 0) {
     
     
        ans.append(stack.removeLast());
    }
    return ans.toString();
}

おすすめ

転載: blog.csdn.net/qq_41512783/article/details/109306857