20.有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
Python most votes solution:
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
stack = []
dict = {"]":"[", "}":"{", ")":"("}
for char in s:
if char in dict.values():
stack.append(char)
elif char in dict.keys():
if stack == [] or dict[char] != stack.pop():
return False
else:
return False
return stack == []
分析:该代码用到了栈,使用了字典来定义左右括号的匹配规则,并针对以下四种情况均做出了相应的应对措施:
情况一:缺少左括号,如
s = )[]{}
应对策略:每一次检测到右括号时,若stack此时非空,则会从stack中pop出左括号。因此若在检测到右括号时发现stack是空的,则说明左括号肯定是缺失了,此时会return False。因而缺少左括号的情形会被检测出来。
情况二:缺少右括号,如
s = {[]}(
应对策略:每一次检测到右括号时,都会从stack中pop出左括号。但如果s中缺少一个右括号,则stack中最终会残余一个左括号,因此此时stack必定非空,即在程序中只要最终return stack == [ ]即可。
情况三:左右括号不匹配,如
s = ([)]
其实前两种情况中缺少左括号或缺少右括号的某些情形也包含在情况三中(如
s = [)]{}
或s = {[(]}
),此时是单独的那个括号和别的右括号发生了匹配,这些情况都可以统一放在情况三中一块解决应对策略:当检测到右括号时,立即pop出左括号,检查它们是否匹配。若不匹配则立即return False。括号的匹配规则已在字典dict中由键值对来定义。
情况四:输入的字符串为空
按照题目定义,空字符串也是有效字符串。如何将这一特殊情形融入到代码中?
在上述代码中,这一过程是通过在程序一开始时定义一个空的栈
stack = []
,然后在程序的最后又检查stack是否为空来实现的:return stack == []
,因为整个for循环被设置为空字符串是无法进入的,所以代码中这个“首尾呼应”便很好地解决了输入是空字符串的问题。