题目描述
方法
1. 栈保存子串下标
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:
print(stack,i)
res = max(res,i - stack[-1])
return res
2. 动态规划
class Solution:
def longestValidParentheses(self, s: str) -> int:
if not s:
return 0
n = len(s)
dp = [0] * n
if s[:2] == "()":
dp[1] = 2
for i in range(2, n):
if s[i] == "(":
dp[i] = 0
else:
if s[i-1] == "(":
dp[i] = dp[i-2] + 2
else:
if i - dp[i-1] - 1 < 0:
dp[i] = 0
else:
if s[i - dp[i-1] - 1] == "(":
dp[i] = dp[i-1] + 2 + dp[i - dp[i-1] - 2]
print(dp)
return max(dp)