思路:
检查括号配对的原则如下:在扫描正文的过程中,遇到的闭括号应该与此前最近遇到且尚未获得匹配的开括号配对。如果最近未匹配的开括号与当前闭括号不配对,或者找不到这样的开括号,就是匹配失败,说明这段正文里的括号不匹配。
由于括号的出现可能嵌套,需要逐对匹配:当前闭括号应当与前面最近的尚未匹配的开括号匹配,下一个括号应当与前面次近的括号匹配。这说明需要存储的开括号的使用原则是后存入者先使用,符合LIFO原则。
进而,如果一个符号已配对,就应该删除这个括号,为随后的匹配做好准备。显然,在扫描的过程中,后遇到并保存的开括号将先配对并被删除,这是按出现的顺序后进先出。这些情况说明,用栈保存遇到的开括号可以支持匹配工作。
具体的python代码如下:
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
if len(s) % 2 == 1:
return False
Stack = []
char_dict = {
"]":"[",
")":"(",
"}":"{"
}
# 扫描符号
for char in s:
# 判断闭括号
if char in char_dict:
# not Stack是指不为空,则说明左右括号不一致
# Stack.pop()如果不匹配则返回False,如果匹配Stack也执行了出栈操作(重点)
if not Stack or char_dict[char] != Stack.pop():
return False
# 保存开括号
else:
Stack.append(char)
return not Stack