【LeetCode-简单】20. 有效的括号 - 栈

20. 有效的括号


解法:栈

一看到括号匹配的问题,第一想法就是用栈来实现,对字符串进行扫描,如当前字符为 ’ ( ’ ’ [ ’ ’ { ',则压入栈,否则弹出栈顶,判断栈顶字符与当前字符是否匹配,若匹配则继续对下一字符进行判断,不匹配则返回false。需注意,存在第一个字符九尾 ’ ) ’ ’ ] ’ ’ } ’ 的情况,该情况显然不匹配,所以在弹出栈顶字符前需对当前栈是否为空进行判断,若为空,显然字符串无效,返回false

此外,还存在如 “[[()” 的情况,所以在扫描字符串完毕后还需要对当前栈是否为空进行判断,为空表示括号匹配成功,字符串有效,返回true;非空则表示字符串无效,返回false

代码如下:

class Solution {
    
    
public:
    bool isValid(string s) {
    
    
        stack<char> sta;
        for(int i=0;i<s.length();i++){
    
    
            if(s[i]=='(' || s[i]=='[' || s[i]=='{'){
    
    
                sta.push(s[i]);
            }
            else{
    
    
                if(sta.empty()) return false;
                char temp=sta.top();
                sta.pop();
                if((temp=='('&&s[i]==')') || (temp=='['&&s[i]==']') || (temp=='{'&&s[i]=='}')){
    
    
                    continue;
                }else{
    
    
                    return false;
                }
            }
        }
        if(sta.empty()) return true;
        else return false;
    }
};

力扣给出的题解中利用 map 使判断是否匹配的过程更为简洁,代码如下供参考:

class Solution {
    
    
public:
    bool isValid(string s) {
    
    
        int n = s.size();
        if (n % 2 == 1) {
    
    
            return false;
        }

        unordered_map<char, char> pairs = {
    
    
            {
    
    ')', '('},
            {
    
    ']', '['},
            {
    
    '}', '{'}
        };
        stack<char> stk;
        for (char ch: s) {
    
    
            if (pairs.count(ch)) {
    
    
                if (stk.empty() || stk.top() != pairs[ch]) {
    
    
                    return false;
                }
                stk.pop();
            }
            else {
    
    
                stk.push(ch);
            }
        }
        return stk.empty();
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43619058/article/details/125946056
今日推荐