题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
解法
使用栈的思想。
若出现一个右括号,判断栈顶的是否为相匹配的左括号,是则出栈,否则入栈。遇到左括号就入栈。显然,有效的括号一定保证最终栈为空,若出现一个右括号,且栈已空,则一定无效。
步骤
初始化括号对应关系dict={")":"(","}":"{","]":"["}
,stack=[]
。
遍历括号字符串s[i]
,遍历区间[0,len(s))
:
- 若
s[i]
为右括号:
若栈不为空:若栈顶括号和s[i]
匹配,则将栈顶退栈。否则:将当前右括号进栈。
若栈为空,返回False
。
-
若为左括号:将其入栈
-
返回栈是否为空
code如下:
class Solution(object):
def isValid(self, s):
dict1 = {')':'(', ']':'[', '}':'{'}
s1 = []
for i in s:
if i in dict1:
if s1:
if s1[-1] == dict1[i]:
s1.pop()
else:
s1.append(i)
else:
return False
else:
s1.append(i)
return not s1
可以简化如下:
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
dicct = {')':'(', ']':'[', '}':'{'}
stack = []
for i in range(len(s)):
if stack and s[i] in dicct:
if stack[-1] == dicct[s[i]]:
stack.pop()
else:
return False
else:
stack.append(s[i])
return False if stack else True
# return not stack