0032.最长有效括号
方法一:动态规划
时间复杂度 $O(n)$,空间复杂度 $O(n)$。
func longestValidParentheses(s string) int {
dp, ans := make([]int, len(s)), 0
if len(s) > 1 && s[0] == '(' && s[1] == ')' {
ans, dp[1] = 2, 2
}
for i := 2; i < len(s); i++ {
if s[i] == ')' && s[i-1] == '(' {
dp[i] = dp[i-2] + 2
} else if s[i] == ')' && i-dp[i-1]-1 >= 0 && s[i-dp[i-1]-1] == '(' {
dp[i] = dp[i-1] + 2
if i-dp[i-1]-2 >= 0 {
dp[i] += dp[i-dp[i-1]-2]
}
}
if ans < dp[i] {
ans = dp[i]
}
}
return ans
}