leetcode-20 有效的括号匹配

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串

示例 1:

输入: “()”
输出: true

示例 2:

输入: “()[]{}”
输出: true

方法一:
遇到左括号,压栈
遇到右括号,弹栈

bool isValid(string s) {
    if(s.length() == 0) return true;

    stack<char> S;
    for (int i = 0;i < s.length(); ++i) {
        switch(s[i]) {
            case ')':
            {
                if(!S.empty()) {
                    if(S.top() == '('){
                        S.pop();
                    } else {
                        return false;
                    }
                }else {
                    return false;
                }
                break;
            }
            case ']':
            {
                if(!S.empty()) {
                    if(S.top() == '['){
                        S.pop();
                    } else {
                        return false;
                    }
                }else {
                    return false;
                }
                break;                    
            }
            case '}':
            {
                if(!S.empty()) {
                    if(S.top() == '{'){
                        S.pop();
                    } else {
                        return false;
                    }
                }else {
                    return false;
                }
                break;                    
            }
            case '(':
            {
                S.push(s[i]);
                break;
            }
            case '[':
            {
                S.push(s[i]);
                break;
            }
            case '{':
            {
                S.push(s[i]);
                break;
            }
        }
    }
    if (S.size() != 0) {
        return false;
    }
    return true;
}

方法二:
同样的思路,优化代码逻辑,使用map建立括号之间的映射关系

bool isValid(string s) {
    map<char,int> m{{'(',1},{'[',2},{'{',3},
                            {')',4},{']',5},{'}',6}};
    stack<char> st;
    bool res=true;
    for(char c:s){
        int flag=m[c];
        if(flag>=1&&flag<=3) st.push(c);
        else if(!st.empty()&&m[st.top()]==flag-3) st.pop();
        else {res=false;break;}
    }
    if(!st.empty()) res=false;
    return res;
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页