Python.LC20.有效的括号_栈

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

有效字符串需满足:

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

示例 1:
输入:s = “()”
输出:true

示例 2:
输入:s = “()[]{}”
输出:true

示例 3:
输入:s = “(]”
输出:false

示例 4:
输入:s = “([)]”
输出:false

示例 5:
输入:s = “{[]}”
输出:true

提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        dic = {'{': '}',  '[': ']', '(': ')', '?': '?'}
        stack = ['?']#注释1
        for c in s:
            if c in dic: 
                stack.append(c)
            elif dic[stack.pop()] != c:#注释2
                return False 
        return len(stack) == 1 #注释3

stack.pop()删掉列表的最后一个元素,并返回删掉的这个元素

注释1:
如果stack 为空且c为右括号,stack.pop() 操作会报错;因此,我们采用一个取巧方法,给 stack 赋初值 ? ,并在哈希表 dic 中建立 key: ‘?’,value:’?‘的对应关系予以配合。此时当 stack 为空且c为右括号时,可以正常提前返回 false;
elif dic[stack.pop()] != c这一步每运行一次都会减掉stack里的一个元素,当前面都运行正常,最后一个c为右括号(最后一次判定)时,删掉的是预设的’?’。

注释2:
会出现在elif dic[stack.pop()] != c:这一步的c只能是是某种右括号,如果上一个进入stack的元素(stack的最后一个元素,为key)对应的值不是i的话,说明i不是它的右括号,括号没有正确关闭。

注释3:
如果字符串 s 前面都正确,但是以左括号结尾:
此情况下可以正常遍历完整个 s,但stack 中遗留未出栈的左括号,此时len(stack)就是2(还有预设的?没删掉);因此,最后需返回 len(stack) == 1,以判断是否是有效的括号组合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值