题目
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
数据范围:字符串长度 0≤100000≤n≤10000
要求:空间复杂度 O(n),时间复杂度O(n)
示例1
输入:"["
返回值:false
解题思路
1.若字符串长度为奇数,则说明序列中字符存在不成对,肯定不合法
2.采用堆栈的方式来判断,先将所有字符全部入栈stack1
3.
(1)若存在非法字符,直接返回False
(2)若stack1栈顶元素和stack2栈顶元素不匹配,则将stack1栈顶元素弹出并入stack2栈中
(3)若stack1和stack2内均无元素,则说明字符全部成对
(4)若stack1无元素,stack2有元素,则说明字符没有全部成对
题解
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param s string字符串
# @return bool布尔型
#
class Solution:
def isValid(self , s: str) -> bool:
# 1.若字符串长度为奇数,则说明序列中字符存在不成对,肯定不合法
if len(s)%2==1:return False
# 2.采用堆栈的方式来判断,先将所有字符全部入栈stack1
stack1=[]
stack2=[]
for i in s:
stack1.append(i)
stack2.append(stack1.pop())
while stack1!=[]:
# 存在非法字符,直接返回False
if stack1[-1] not in ["{","}","[","]","(",")"]:return False
# 若stack1栈顶元素和stack2栈顶元素不匹配,则将stack1栈顶元素弹出并入stack2栈中
if (stack1[-1]=="{" and stack2[-1]=="}") or (stack1[-1]=="[" and stack2[-1]=="]") or (stack1[-1]=="(" and stack2[-1]==")"):
stack1.pop()
stack2.pop()
# 若stack1和stack2内均无元素,则说明字符全部成对
if stack1==[] and stack2==[]:return True
else:
stack2.append(stack1.pop())
return False