20. 有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串 s , 判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。
题解:
直接用栈实现,将左括号入栈,当扫到右括号时出栈,当栈空则返回
在python中其实栈就是表 [] 但是写个栈类,看着更加优雅 优雅永不过时 !!! 针对小问题而言,其实没必要写个栈类,直接列表就可,但是在较大程序中,写个栈类,会更便捷,可读性,维护上也更容易。
最重要 python需要优雅,优雅永不过时!!!
栈类
class Stack(object):
def __init__(self):
"""
创建一个Stack类
对栈进行初始化参数设计
"""
self.stack = [] #存放元素的栈
def get_top(self):
"""
获取栈顶元素
"""
if self.stack:
return self.stack[-1]
else:
return None
def push(self, data):
"""
压入 push :将新元素放在栈顶
当新元素入栈时,栈顶上移,新元素放在栈顶。
"""
self.stack.append(data)
def pop(self):
"""
弹出 pop :从栈顶移出一个数据
- 栈顶元素拷贝出来
- 栈顶下移
- 拷贝出来的栈顶作为函数返回值
"""
# 判断是否为空栈
if self.stack:
return self.stack.pop()
else:
raise IndexError("从空栈执行弹栈操作")
def is_empty(self):
"""
判断栈是否为空
"""
# 栈为非空时,self.stack为True,再取反,为False
return not bool(self.stack)
def size(self):
"""
返回栈的大小
"""
return len(self.stack)
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
r=Stack()
for x in s:
if x=="(" or x=="{" or x=="[":
r.push(x)
elif x==")" and r.get_top()=="(":
r.pop()
elif x=="}" and r.get_top()=="{":
r.pop()
elif x=="]" and r.get_top()=="[":
r.pop()
else:
return False
if r.is_empty():
return True
else:
return False
- 时间复杂度:
只是遍历一遍字符串 O(n)
- 空间复杂度:
由于使用了一个栈(本质是个表[]),故空间上就是一个表