美文网首页
20. 有效的括号

20. 有效的括号

作者: 周英杰Anita | 来源:发表于2020-06-18 15:01 被阅读0次

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

    有效字符串需满足:

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

    示例 1:

    输入: "()"
    输出: true
    

    示例 2:

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

    示例 3:

    输入: "(]"
    输出: false
    

    示例 4:

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

    示例 5:

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

    思路

    栈先入后出特点恰好与本题括号排序特点一致,即若遇到左括号入栈,遇到右括号时将对应栈顶左括号出栈,则遍历完所有括号后 stack 仍然为空;
    建立哈希表 dic 构建左右括号对应关系:key左括号,value右括号;建立栈 stack,遍历字符串 s 并按照算法流程一一判断。
    如果 c 是左括号,则入栈 push;
    否则通过哈希表判断括号对应关系,若 stack 栈顶出栈括号 stack.pop() 与当前遍历括号 c 不对应,则提前返回 false
    解决边界问题:
    栈 stack 为空: 此时 stack.pop() 操作会报错;
    因此,我们采用一个取巧方法,给 stack 赋初值 ? ,并在哈希表 dic 中建立 key: '?',value:'?′ 的对应关系予以配合。此时当 stack 为空且 c 为右括号时,可以正常提前返回 false;
    字符串 s 以左括号结尾: 此情况下可以正常遍历完整个 s,但 stack 中遗留未出栈的左括号;
    因此,最后需返回 len(stack) == 1,以判断是否是有效的括号组合。
    

    python3解法

    class Solution:
        def isValid(self, s: str) -> bool:
            # 为什么要存储"?":"?",如果遇到右括号的时候,在执行dic[stack.pop()]的时候不会报错
            dic = {"(":")","[":"]","{":"}","?":"?"}
            # 为什么stack不能是空的,如果为空,当遇到右括号的时候,stack.pop会出错
            stack = ["?"]
            for c in s:
                if c in dic:
                    stack.append(c)
                elif dic[stack.pop()] != c:
                    return False
            return len(stack) == 1
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/valid-parentheses

    相关文章

      网友评论

          本文标题:20. 有效的括号

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