2020.07.04 周六
32最长有效括号
题目:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
——————————我是分割线——————————
解法:
思路:使用堆栈
。遇到“(”,则将其下标压入栈;遇到“)”,且前面没有“(”与之对应,则将最后一个“)”的下标存到stack中;遇到“)”,且前面有“(”与之对应,则pop删除“(”的下标,并计算res=index-stack[-1](当前下标 - stack中最后一个元素的下标stack[-1])。
注意stack初始化-1,因为如果以"()"开头,则res=1-(-1)=2
如果以右括号开头/前面没有左括号与之对应,则将最后一个右括号的下标存入stack(转化为stack长度是否为1的问题),如果大于1则说明前面有未匹配的左括号;如果等于1则说明前面没有未匹配的左括号,则重新初始化stack,以下一次左括号的前一个元素的下标作为stack的初始值。
下面用到的一个Python内置函数——enumerate
(相关知识 传送门:enumerate()函数)
代码:
class Solution(object):
def longestValidParentheses(self, s):
"""
:type s: str
:rtype: int
"""
res = 0
stack = [-1] #初始化堆栈为-1 以便一开始() res=1-(-1)
for index,key in enumerate(s): #遍历s获取索引和值
if key=="(": #左括号 则下标进栈
stack.append(index)
elif len(stack)==1: #右括号 且前面没有(匹配 则保留最后右括号的下标
stack.pop()
stack.append(index)
else: #右括号 且前面有(匹配 则删除(下标 计算res 更新res
stack.pop()
res = max(res,index-stack[-1])
return res