015_最长有效括号
知识点:括号、栈、动态规划
LeetCode第三十二题:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/
还有种更秀的解法,就是运作左右指针,有双指针的味道,时间为O(n),空间O(1)
语言:GoLang
// 一般来说,括号相关的题目,都能用栈解决,只是怎么运用栈而已,思路!
func longestValidParentheses(s string) int {
length := len(s)
if length < 2 {
return 0
}
result := 0
stack := []int{-1}
for i := 0; i < length; i++ {
if s[i] == '(' {
stack = append(stack, i)
}else {
if len(stack) > 0 {
stack = stack[:len(stack) - 1]
}
if len(stack) == 0 {
stack = append(stack, i)
}else {
if i - stack[len(stack) - 1] > result {
result = i - stack[len(stack) - 1]
}
}
}
}
return result
}
// DP解法:以第i个元素结尾的子串的最长有效括号
func longestValidParentheses_(s string) int {
length := len(s)
dp := make([]int, length)
if length < 2 {
return 0
}
if s[0] == '(' && s[1] == ')' {
dp[1] = 2
}
result := dp[1]
for i := 2; i < length; i ++ {
if s[i] == ')' {
if s[i - 1] == '(' {
dp[i] = dp[i - 2] + 2
}
pre := i - 1 - dp[i - 1]
if s[i - 1] == ')' && pre >= 0 && s[pre] == '('{
dp[i] = 2 + dp[i - 1]
prePre := i - 2 - dp[i - 1]
if prePre > 0 {
dp[i] += dp[prePre]
}
}
}
if dp[i] > result {
result = dp[i]
}
}
return result
}

浙公网安备 33010602011771号