Leikou 20有効ブラケット(スタック実装)

1.タイトル

ここに画像の説明を挿入

2.私の最初の考えと問題

1.アイデアを書く前にいくつかの知識ポイントを要約します。
(1)文字列sの場合、文字取得
するs.length()メソッドで長
char c = s.charAt(i);取得します。iは0から始まるインデックスです。
(2)スタック
作成の場合:Stack<Character> stack = new Stack<>();、パッケージクラスCharacterに注意してください。 、for charスタックに
プッシュstack.push(c);
:スタックからポップアウト:stack.pop();
空であると判断し、スタックの最上位要素を判断します:
if(!stack.isEmpty() && stack.peek()== ‘(’){...}

2.アイデア
(1)文字列の長さは2倍の数値、つまりs.length()%2 == 0である必要があります。そうでない場合、直接falseが返されます。
(2)文字cが([{ This 3つのシンボル、スタックを実行しますpush(c)
(3)cが3種類の右括弧の場合、それらについて個別に説明します。スタックが空であるかどうか、およびスタックの一番上のpeek()が対応する左括弧であるかどうかを確認します。空の場合は、ポップします。スタック、それ以外の場合はfalseを返します。

3.私が書いたコードを実行した後の問題
(1)c == '('を二重引用符として記述します。cはcharタイプであることに注意してください。単一引用符を使用し、文字列には二重引用符を使用する必要があります。これに注意してください、注意しないでください。無視するのは簡単です。
(2)コードを書いた後、それを忘れてreturn stack.isEmpty()、自己検査の後に見つけます。トラバーサルの後、空のスタックが実行され、有効な括弧は空のスタックです。

3.問題解決方法1:スタック

自分で書いたコードに直接:

class Solution {
    
    
    public boolean isValid(String s) {
    
    
        Stack<Character> stack = new Stack<>();
        //字符串包含的字符数能被2整除
        if(s.length() % 2 == 0){
    
    
            for(int i = 0;i < s.length();i++){
    
    
                char c = s.charAt(i);
                if(c == '(' || c== '[' || c == '{'){
    
    
                    //入栈
                stack.push(c);
                }else if(c == ')'){
    
    
                    if(!stack.isEmpty() && stack.peek() == '('){
    
    
                        stack.pop();
                    }else{
    
    
                        return false;
                    }
                }else if(c == ']'){
    
    
                    if(!stack.isEmpty() && stack.peek() == '['){
    
    
                        stack.pop();
                    }else{
    
    
                        return false;
                    }
                }else{
    
    
                    if(!stack.isEmpty() && stack.peek() == '{'){
    
    
                        stack.pop();
                    }else{
    
    
                        return false;
                    }
                }
                
            }
            //这一句不要忘记,一开始漏掉了
            return stack.isEmpty(); 
        }
        return false;
    }
}

公式の問題解決策は、スタック内のHashMapを使用します。問題解決策は、私が作成したものと似ていますが、データストレージの形式が異なります。公式コードも次のように記述されています。

class Solution {
    
    
    public boolean isValid(String s) {
    
    
        int n = s.length();
        if (n % 2 == 1) {
    
    
            return false;
        }

        Map<Character, Character> pairs = new HashMap<Character, Character>() {
    
    {
    
    
            put(')', '(');
            put(']', '[');
            put('}', '{');
        }};
        Deque<Character> stack = new LinkedList<Character>();
        for (int i = 0; i < n; i++) {
    
    
            char ch = s.charAt(i);
            if (pairs.containsKey(ch)) {
    
    
                if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
    
    
                    return false;
                }
                stack.pop();
            } else {
    
    
                stack.push(ch);
            }
        }
        return stack.isEmpty();
    }
}

おすすめ

転載: blog.csdn.net/ambitionLlll/article/details/113943559