LeetCode 20有効な括弧/C++括弧マッチングの検査

9242 ワード

‘(’,’)’,’{’,’}’,’[’,’]’のみを含む文字列を与え,文字列が有効であるか否かを判断する.有効な文字列は、左カッコと同じタイプの右カッコで閉じる必要があります.左かっこは正しい順序で閉じなければなりません.注意空の文字列は有効な文字列とみなされます.
例1:
入力:()出力:true
例2:
入力:“(){}”出力:true
例3:
入力:[(]]出力:false
例4:
入力:「([)]出力:false
例5:
入力:{[]}出力:true
スタックの問題はとても古典的な問題です.各左かっこには右かっこが必要です.カッコが一致しているかどうかを確認する方法は、「期待される急迫度」で説明できます.
[
(
[
]
[
]
)
]
1
2
3
4
5
6
7
8
1を受け入れると、それに一致する8番目の括弧が現れることを期待していましたが、待っていたのは2番目の括弧でした.このとき、1番目の括弧「【」は辺にしか寄らず、2番目の括弧に一致する7番目の括弧「)」が現れるのを切に待つ.・・・・・と類推する.4番目の括弧を受け取った後、3番目の括弧の期待が満たされる.解消された後、2番目の括弧の期待がマッチングされるのが当面の最も急務となる.・・・・・と類推する.
この処理特徴はスタックの特徴と一致し,左かっこが現れるとスタックを押さえ,最も期待されるタスクとする.右かっこが表示されると、それは合法的ではないか、スタックの上部の左かっこを除去することができます.
ACコード:
class Solution {
public:
    bool isValid(string s) {
        stack<char> stacha;
        for(int i = 0; s[i] != '\0'; i++){
            char c = s[i];
            switch(c)
            {
                case '(':
                    stacha.push('(');
                    break;
                    
                case '{':
                    stacha.push('{');
                    break;
                    
                case '[':
                    stacha.push('[');
                    break;
                    
                case ')':
                    if(stacha.empty()) return false;
                    
                    if(stacha.top() != '(') return false;
                    else stacha.pop();
                    break;
                    
                case '}':
                    if(stacha.empty()) return false;
                    
                    if(stacha.top() != '{') return false;
                    else stacha.pop();
                    break;
                    
                case ']':
                    if(stacha.empty()) return false;
                    
                    if(stacha.top() != '[') return false;
                    else stacha.pop();
                    break;
            }
        }
        if(stacha.empty()) return true;
        else return false;
    }
};