leetcode20 有效的括号

32 阅读1分钟

之前做过一次,后面再做一次:出错。发现了之前存在的错误 代码如下

class Solution {
public:
    bool isValid(string s) {

        if(s.size() % 2 == 1) {
            return false;
        }

        unordered_map <char, char> myMap;
        myMap[')'] = '(';
        myMap['}'] = '{';
        myMap[']'] = '[';
        
        stack<char> stk;
        for(char c : s) {
            auto it = myMap.find(c);
            // 未找到,即左括号
            // if(it == myMap.end()) {
            //     stk.push(c);
            // }
            // // 右括号
            // else {
            //     if(!stk.empty()) {
            //         char tmp = stk.top();
            //         if(it->second != tmp) {
            //             return false;
            //         }
            //         stk.pop();
            //     }
            //     else {
            //         return false;
            //     }
            // }
            // 右括号
            if(it != myMap.end()) {
                // 注意stk.empty()一定要放在前面,否则当栈为空,调用stk.top()函数报错
                if(stk.empty() || it->second != stk.top()) {
                    return false;
                }
                else {
                    stk.pop();
                }
            }
            else {
                stk.push(c);
            }

        }
        return stk.empty();
    }
};

需要注意的是if(stk.empty() || it->second != stk.top()) { 判断栈是否为空需要放在前面,括号内部,前面的语句先执行,||运算符,前面的已经为真,不需要再判断后面的