最长有效括号
题目描述
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
解题方法
参考题目:
有效的括号: https://mp.csdn.net/mdeditor/89879475#
括号的生成 : https://mp.csdn.net/mdeditor/89894111#
参考方法:
LeetCode评论
方法一:
出栈入栈方法
参考之前的有效括号题目, 当“)“前一个为(则删除这对,当全部删除则为有效括号。
在栈中加入(s, index), 有匹配“)”出现,则出栈,则剩下的为不能匹配的括号的信息。
对于不能匹配的括号的索引相减即可得到,有效括号的长度。
选择最大长度即可得到答案。
class Solution:
def longestValidParentheses(self, s: str) -> int:
l = []
for i, ss in enumerate(s):
if ss == ')' and len(l)>0 and l[-1][0]=='(':
l = l[:-1]
else:
l.append((ss, i))
#print(l)
res = []
if not l:
return len(s)
else:
res.append(l[0][1]-0)
res.append(len(s)-1-l[-1][1])
for i in range(1, len(l)):
res.append(l[i][1]-l[i-1][1]-1)
return max(res)
改善后代码:
class Solution:
def longestValidParentheses(self, s: str) -> int:
if not s:
return 0
res = 0
stack = [-1]
for i in range(len(s)):
if s[i] == "(":
stack.append(i)
else:
stack.pop()
if not stack:
stack.append(i)
else:
res = max(res,i - stack[-1])
return res
方法二:
不采用出栈入栈方法:
不删除,而是找到匹配括号后,在与s等长的list中保存每一个括号为开始的最大有效括号长度。
class Solution:
def longestValidParentheses(self, s: str) -> int:
n = len(s)
if n == 0: return 0
dp = [0] * n
res = 0
for i in range(n):
if i>0 and s[i] == ")":
if s[i - 1] == "(":
dp[i] = dp[i - 2] + 2
elif s[i - 1] == ")" and i - dp[i - 1] - 1 >= 0 and s[i - dp[i - 1] - 1] == "(":
dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2]
if dp[i] > res:
res = dp[i]
return res