# 这道题利用栈很容易就做出来的。
# 栈先进后出,让左括号先进去,然后匹配右括号,如果完全匹配就返回真
# 否则就返回假。
# 我借用列表创建了一个栈,但同样可以用列表代替。
# 创建一个栈。
class Stack(object):
def __init__(self):
self.items = []
def is_empty(self):
# 判断是否为空
return self.items == []
def push(self,item):
# 加入元素
self.items.append(item)
def pop(self):
# 弹出元素
return self.items.pop()
def peek(self):
# 返回栈顶元素
return self.items[len(self.items) - 1]
def size(self):
# 返回栈的大小
return len(self.items)
class Solution:
def isValid(self, s: str) -> bool:
self.stack = Stack()
return self.dfs(s) and self.stack.size() == 0
# 如果s为空,就返回真,代表着匹配完了,而且过程中也没有报错
def dfs(self,s):
if s == "":return True
# 判断是左括号还是右括号
if s[0] in ")}]":
# 如果是右括号则栈不能为空
if self.stack.is_empty():
return False
# 然后判断此时栈顶元素是否和右括号匹配。
# 注意,如果匹配成功一定要将左括号弹出。
# 然后进行递归
else:
if s[0] == ")" and self.stack.peek() == "(":
self.stack.pop()
return self.dfs(s[1:])
elif s[0] == "]" and self.stack.peek() == "[":
self.stack.pop()
return self.dfs(s[1:])
elif s[0] == "}" and self.stack.peek() == "{":
self.stack.pop()
return self.dfs(s[1:])
else:
return False
# 这里,如果是左括号,就将元素做压栈处理
else:
self.stack.push(s[0])
return self.dfs(s[1:])
A = Solution()
print(A.isValid("()()()"))
print(A.isValid("()()()"))
print(A.isValid("()[]{}"))
print(A.isValid("()(]]}"))
print(A.isValid(""""""))