给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
有效的括号这个题的变种在之前也看过。这次用python练习一下。
括号左右配对,必然想到的是用栈来实现。遇到左括号压进去,遇到右括号就弹出一个左括号,检查能不能与这个右括号匹配。不能就FALSE。很快写好了第一版的程序:
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
if s == '':
return True
list_left = ['(', '{', '[']
list_right = [')', '}', ']']
if s[0] in list_right: # 第一个字符是右括号,肯定不符合顺序的要求了
return False
stack = []
for element in s:
if element in list_left: # 是左括号就入栈
stack.append(element)
if element in list_right: # 是右括号就出栈
end_element = stack.pop() # 默认删除最后一个元素,相当于弹出
if list_left.index(end_element) != list_right.index(element): # 弹出的最后一个左括号和当前的右括号不匹配
return False
return True
第一次提交,报错,输入是'[])'时由空栈弹出了。看到这个错突然想到两个问题,一是s长度为奇数的话,必然不对称,直接返回False就好;二是需要加判断,遇到右括号时,得判断栈是不是空,空了就直接False得了。
第二次提交,报错,输入是'(('时结果应该是False,我的是True。嗯……循环结束的时候应该判断栈空不空,不空就是这种情况,全是左括号但也不匹配;空了才应该返回True。
第三次提交终于过了。附源代码:
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
if s == '':
return True
if len(s) % 2 == 1: # 奇数个字符,肯定不对称
return False
list_left = ['(', '{', '[']
list_right = [')', '}', ']']
if s[0] in list_right: # 第一个字符是右括号,肯定不符合顺序的要求了
return False
stack = []
for element in s:
if element in list_left: # 是左括号就入栈
stack.append(element)
if element in list_right: # 是右括号就出栈
if len(stack) == 0: # 这时候已经是空栈
return False
else:
end_element = stack.pop() # 默认删除最后一个元素,相当于弹出
if list_left.index(end_element) != list_right.index(element): # 弹出的最后一个左括号和当前的右括号不匹配
return False
if len(stack) == 0: # 循环结束了,栈也空了,说明全部匹配上了
return True
else: # 循环结束了,栈还没空,说明剩一堆左括号没匹配上
return False
网上看到一个比较简洁的写法是这样的(没带函数头):
a = {')':'(', ']':'[', '}':'{'}
l = [None]#设置None是为了排除空值的情况!
for i in s:
if i in a and a[i] == l[-1]:
l.pop()
else:
l.append(i)
return len(l)==1#用来排除空值的情况
用了字典反向匹配。如果有'[]))'的情况,')'也会append到栈里去,但最后只要判断栈是不是为空就好了。None是个特殊的常量,None的类型是Nonetype,但它不是空字符串也不是空列表。可它还是个量,所以最后判断的时候看的是长度是不是1。
就这些,有空继续刷题!