题目
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
难度
简单
相关知识
哈希表 栈
题解
- 错误
class Solution:
def isValid(self, s: str) -> bool:
if len(s)% 2 == 1:
return False
stack = ['?']
dic = {'(':')','{':'}','[':']','?':'?'}
for i in s:
if i in dic:
stack.append(i)
elif dic[stack.pop()]!= i :
return False
return True
错因:字符串 s 以左括号结尾时: 此情况下可以正常遍历完整个 s,但 stack 中遗留未出栈的左括号;因此,最后需返回 len(stack) == 1,以判断是否是有效的括号组合。
- 修正
class Solution:
def isValid(self, s: str) -> bool:
# 因为配对,所以若字符串长度为奇数,必然不有效,可直接提前返回false
if len(s)% 2 == 1:
return False
# 根据有效括号原则:后面的左括号需要先闭合。符合栈规则,考虑构建辅助栈stack
# 根据有效括号原则:括号类型需匹配。考虑初步构建dic = {'(':')','{':'}','[':']'}
# 发现如果右括号出现早于/多于左括号,栈为空,此时.pop会报错
# 所以需要给辅助栈赋一个无意义的初值'?',避免报错
stack = ['?']
dic = {'(':')','{':'}','[':']','?':'?'} # 同时修改dic,为'?'匹配value
for i in s:
if i in dic:
stack.append(i)
elif dic[stack.pop()]!= i :
return False
#return True 直接返回ture会出现,整体无右括号,栈中全是左括号的情况,也是非有效的。
return len(stack) == 1 #若结束循环,栈中仅剩初始值'?',证明全部匹配,则有效。