美文网首页Leetcode解题笔记
#20_有效的括号_哈希做法

#20_有效的括号_哈希做法

作者: FiveZM | 来源:发表于2019-07-10 16:08 被阅读0次

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

    有效字符串需满足:

    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    注意空字符串可被认为是有效字符串。

    示例 1:

    输入: "()"
    输出: true
    示例 2:

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

    输入: "(]"
    输出: false
    示例 4:

    输入: "([)]"
    输出: false
    示例 5:

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


    • 思路:
      用哈希map将右括号记录为key键
      左括号记录为value值
      第一步 如果这个是右括号,并且map里面包含这个键,则弹出栈中的左括号来匹配
      第二步 如果是左括号则压入栈中
      第三步 如果匹配完成后,栈中还有数据的话,则证明该字符串的符号不匹配,有多余的左括号

    via LeetCode官方答案 https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode/


        public static boolean isValid(String s) {
            HashMap<Character, Character> map = new HashMap<>();
            Stack<Character> stack = new Stack<>();
            map.put(')', '(');
            map.put(']', '[');
            map.put('}', '{');
    
            for (int i = 0; i < s.length(); i++) {
    
                //如果map包含的是键,即是右括号,则弹出栈顶元素判断是否匹配
                if (map.containsKey(s.charAt(i))) {
                    char c = stack.empty() ? '#' : stack.pop();  //用#号来标记栈为空,因为没有括号可以和#相匹配
                    if (c != map.get(s.charAt(i))) //map 通过右括号拿出左括号来做判断,如果相等则匹配,不等则不匹配
                        return false;
                } else {
                    stack.push(s.charAt(i));//把左括号压入栈
                }
            }
            return stack.isEmpty(); // 如果栈内还有元素,则证明左括号还有多出来,但没有右括号匹配了,为空则证明匹配完成
        }
    

    相关文章

      网友评论

        本文标题:#20_有效的括号_哈希做法

        本文链接:https://www.haomeiwen.com/subject/jlvhkctx.html