1.括号需要一一匹配,而且先来的左括号,只能匹配后面的右括号,因此可以考虑使用栈的先进后出功能,使括号匹配。
使用栈来记录左括号下标。
遍历字符串,左括号入栈,每次遇到右括号则弹出左括号的下标。
然后长度则更新为当前下标与栈顶下标的距离。
遇到不符合的右括号,可能会使栈为空,因此需要使用start记录上一次结束的位置,这样下次用当前下标减去start即可获取长度
#括号匹配都是用栈。
class Solution:
def longestValidParentheses(self , s: str) -> int:
res,z,start=0,[],-1
for i in range(len(s)):
if s[i]=='(':
z.append(i)
elif s[i]==')':
if not z:#未匹配到的右括号
start=i#相当于记录上⼀次连续括号结束的位置
else:
z.pop()
if z:
res=max(res,i-z[-1])#栈中还有左括号,说明右括号不够,减去栈顶位置就是⻓度
else:
res=max(res,i-start)#减去上⼀次结束的位置就是⻓度
return res
2.题:给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭。
创建辅助栈,遍历字符串。
每次遇到小括号的左括号、中括号的左括号、大括号的左括号,就将其对应的反括号加入栈中,期待在后续遇到。
如果遇到相同的相邻的反括号,则弹出栈顶元素继续遍历。
栈中元素最后是为空的说明所有的匹配正确
class Solution:
def isValid(self , s: str) -> bool:
z=[]
for i in range(len(s)):
if s[i]=="(":#当为(字符时,将匹配字符入栈,下同
z.append(")")
elif s[i]=="{":
z.append("}")
elif s[i]=="[":
z.append(']')
else:##当字符不是'(','[','{'这三种字符时,则判断当前字符是否与栈顶元素一样(栈非空时
if z and s[i]==z[-1]:
z.pop()
else:
return False
return len(z)==0