栈——有效括号问题
问题:给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。
3、空字符串可被认为是有效字符串。
解法一: 笨办法,分情况判断,代码比较冗长
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
if s == "": # 单独处理s为空的情况
return True
stack = [] # 建立一个空的栈
for item in s: # 遍历
if len(stack) == 0: # 如果堆栈为空,直接入栈,跳过此次循环
stack.append(item)
continue
# 下面分别判断了三种右括号的情况
if item == ')':
length = len(stack)
if stack[length-1] == '(':
del stack[length-1]
continue
if item == ']':
length = len(stack)
if stack[length-1] == '[':
del stack[length-1]
continue
if item == '}':
length = len(stack)
if stack[length-1] == '{':
del stack[length-1]
continue
# 如果item不是右括号,或者栈顶元素不是左括号,则压栈,继续循环
stack.append(item)
# 最后判断,stack是否为空
if len(stack) != 0:
return False
return True
方案二:比较简洁的写法, 用map存储所有的 括号
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
stack = []
bracket_map = {'}':'{',')':'(',']':'['}
for ch in s:
if ch not in bracket_map: # 如果ch不是右括号,则压栈
stack.append(ch)
elif not stack or bracket_map[ch]!=stack.pop(): # 如果ch是‘右括号’,那么栈顶元素一定可以找到与之对应的‘左括号’;如果没有,那么不合法
return False
return not stack # 最后,判断stack是否为空,写法比较简洁
时间复杂度:O(n)
空间复杂度:O(n)