最长有效括号
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号
子串的长度。
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
题解:
单调栈 or 动态规划
func longestValidParentheses(s string) int {
// 单调栈
stack := []int{}
ans := 0
stack = append(stack, -1)
for i := 0; i < len(s); i++ {
if s[i] == '(' {
stack = append(stack, i)
} else {
stack = stack[:len(stack)-1]
if len(stack) == 0 {
stack = append(stack, i)
} else {
ans = max(ans, i - stack[len(stack)-1])
}
}
}
return ans
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
如果 s[i]=‘)’ 且 s[i−1]=‘(’,也就是字符串形如 “……()”,我们可以推出:
dp[i]=dp[i−2]+2
如果 s[i]=‘)’ 且 s[i−1]=‘)’,也就是字符串形如 “……))”,我们可以推出:
如果 s[i−dp[i−1]−1]=‘(’,那么
dp[i]=dp[i−1]+dp[i−dp[i−1]−2]+2
func longestValidParentheses(s string) int {
maxAns := 0
dp := make([]int, len(s))
for i := 1; i < len(s); i++ {
if s[i] == ')' {
if s[i-1] == '(' {
if i >= 2 {
dp[i] = dp[i - 2] + 2
} else {
dp[i] = 2
}
} else if i - dp[i - 1] > 0 && s[i - dp[i - 1] - 1] == '(' {
if i - dp[i - 1] >= 2 {
dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2
} else {
dp[i] = dp[i - 1] + 2
}
}
maxAns = max(maxAns, dp[i])
}
}
return maxAns
}
func max(x, y int) int {
if x > y {
return x
}
return y
}