leetcode 20. Valid Parentheses 题解【C++/Java/Python】

20. 有效的括号
20. Valid Parentheses

题目:

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

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

示例 1:

输入: “()”
输出: true

示例 2:

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

示例 3:

输入: “(]”
输出: false

题解:

主要使用栈。遇到左括号'(', '[', '{'时,直接入栈,遇到右括号‘)’, ']', '}'时,则与栈顶元素比较,如果是匹配的,则直接将栈顶元素出栈,如果栈为空或者不匹配,则直接返回False。括号字符串遍历结束后,还需要检查栈是否为空,为空才表示是一个合法的括号组合。

技巧:

使用map,以右括号为key,左括号为value,可以减少代码量。

C++
class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        unordered_map<char, char> map;//给括号建立map
        map[')'] = '(';
        map['}'] = '{';
        map[']'] = '[';
        for(auto c : s){
            switch(c){
                case '('://左括号直接入栈
                case '[':
                case '{':
                    st.push(c);
                    break;
                case ')':
                case ']':
                case '}':
                    if(st.empty() || st.top() != map[c]){//栈为空或者与栈顶不匹配,返回false
                        return false;
                    }
                    st.pop();
                    break;
            }
        }
        return st.empty();//栈为空则是合法的
    }
};
Java
class Solution {
    public boolean isValid(String s) {
        Stack<Character> st = new Stack<Character>();
        HashMap<Character, Character> map = new HashMap<Character, Character>(){{
            put( ')', '(');
            put( ']', '[');
            put( '}', '{');
        }};
        char chrs[] = s.toCharArray();
        for(Character c : chrs) {
            switch(c) {
                case '('://处理左括号
                case '[':
                case '{':
                    st.push(c);
                    break;
                case ')'://右括号
                case ']':
                case '}':
                    if(st.empty() || st.pop() != map.get(c)) {//栈为空或者栈顶元素不匹配,返回false
                        return false;
                    }
                    break;
            }
        }
        return st.empty();//栈为空则合法
    }
}
Python
class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        st = []
        dic = {')':'(', '}':'{', ']':'['} # 括号的map
        for c in s:
            if c == '(' or c == '[' or c == '{':# 左括号
                st.append(c)
            elif c == ']' or c == ')' or c == '}':# 右括号
                if len(st) == 0 or st.pop() != dic[c]: # 栈为空或者栈顶不匹配,返回false
                    return False
        return len(st) == 0

猜你喜欢

转载自blog.csdn.net/androidchanhao/article/details/81475454