1. 32. 最长有效括号
注意: 子串是连续的
1.1 解法一:
dfs
class Solution:
def longestValidParentheses(self, s: str) -> int:
stack = []
max_len = 0
def dfs(sub, i, left, right):
nonlocal max_len
if left < right:
return
if left == right:
max_len = max(len(sub),max_len)
if i >= len(s):
return
if (len(sub) + len(s)-i)<max_len:
return
if sub[-1] == "(":
if s[i] == ")":
dfs(sub + s[i], i + 1, left, right + 1)
else:
dfs(sub + s[i], i + 1, left+1, right)
else:
if s[i] == "(":
dfs(sub + s[i], i + 1, left + 1, right)
else:
dfs(sub + s[i], i + 1, left , right+1)
for i in range(len(s)):
if s[i] == "(":
dfs("(", i + 1, 1, 0)
return max_len
这种做法暴力法,会超时
1.2 动态规划:
解题思路:
我们用 dp[i] 表示以 i 结尾的最长有效括号;
当 s[i] 为 (,dp[i] 必然等于 0,因为不可能组成有效的括号
那么 s[i] 为 )
2.1 当 s[i-1] 为 (,那么 dp[i] = dp[i-2] + 2;
2.2 当 s[i-1] 为 ) 并且 s[i-dp[i-1] - 1] 为 (,那么 dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2];
时间复杂度:O(n)O(n)。
这样要注意以下2.2 的情况。
class Solution:
def longestValidParentheses(self, s: str) -> int:
dp = [0]*len(s)
res=0
for i in range(1,len(dp)):
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]
res= max(dp[i],res)
return res
3. 参考链接:
链接:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-powcai/