题目描述
有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
解决方法
方法一:堆栈
使用stack
这种结构.
- 先建立一个
map
- 遍历字符串,对输入的字符串入栈操作(如果入栈的元素是
key
的话) - 依次比较,直到出现不匹配或者栈里所有元素都比较结束(栈空)。
- 还要注意这样的问题:如果最后多余了’key‘,比如
()[]{}(
,所以最后还要判断一下len(stack)==0
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
stack = list()
match = {'{':'}', '[':']', '(':')'}
for i in s:
if i == '{' or i == '(' or i == '[':
stack.append(i)
else:
if len(stack) == 0:
return False
top = stack.pop()
if match[top] != i:
return False
if len(stack) != 0:
return False
return True
方法二:堆栈
注意点:
- 字典中存入的是右括号为
key
。 - 遍历,每次比较与栈中的最后一个元素
stack[-1]
(左括号)是否匹配。 - 匹配则栈出,否则栈入。
- 考虑到
stack[-1]
在栈空时会遇到语法问题,就先加入一个None
元素,所以最后判断栈长度为1就是True
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
stack = [None]
match = {'}':'{', ']':'[', ')':'('}
for i in s:
if i in match and match[i]==stack[-1]:
stack.pop()
else:
stack.append(i)
return len(stack)==1
运行时间比「方法一」快一些。
「方法一」的改进
第1处
把原代码的这行↓
if i == '{' or i == '(' or i == '[':
改成以下写法:
if i in match:
运行时间比「方法二」还快。
第2处
把原代码的这几行↓
top = stack.pop()
if match[top] != i:
return False
改成以下写法:
if match[stack[-1]] != i:
return False
stack.pop()