Leetcode 有效的括号

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

  有效字符串需满足:a. 左括号必须用相同类型的右括号闭合      b.左括号必须以正确的顺序闭合。

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

示例一

输入: "()"
输出: true

示例二

输入: "()[]{}"
输出: true

示例三

输入: "(]"
输出: false

示例四

输入: "([)]"
输出: false

示例五

输入: "{[]}"
输出: true

解法

栈和哈希表的结合

       将右括号和左括号,以键值(key-value)的形式存储在哈希表中。然后遍历字符串,如果当前字符不在哈希表中(即它是一个左括号),那么就将它入栈,等待相匹配的右括号;如果在哈希表中,那么就取栈顶元素,看它是否和当前字符先匹配,如果不匹配,直接返回false。如果最终的栈中有剩余元素,返回false,否则返回true。

class Solution {
public:
    bool isValid(string s) {
        if(s == "") return true;
        int len = s.length();
        if(len % 2) return false; // 奇数个括号,直接返回false

        stack<char> s1;
        unordered_map<char, char> mapping;
        mapping[')'] = '(';
        mapping[']'] = '[';
        mapping['}'] = '{';

        for(int i=0; i<len; i++){
            // 哈希表里面有当前的括号
            if(mapping.find(s[i]) != mapping.end()){
                char top_element = (!s1.empty()) ? s1.top(): '#';
                if(top_element != mapping[s[i]]) return false;
                else s1.pop();
            }
            else s1.push(s[i]);
        }

        if(s1.empty()) return true;
        else return false;
    }
};

 

posted @ 2020-04-30 10:21  Crazy_Coding  阅读(106)  评论(0)    收藏  举报