题目:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 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,以判断是否是有效的括号组合。