链接
题目.
难度:
high
解答:
字符串首先想到dp,以第n个数为结尾的最大括号数,要么是前面n-1的最大括号数,要么是一第n个数结尾的括号数
package main
import "fmt"
func endLongerst(s string) int {
rights := 0
pairs := 0
for i := len(s) - 1; i >= 0; i-- {
if s[i] == ')' {
rights++
} else {
rights--
if rights < 0 {
break
}
if rights == 0 {
pairs = len(s) - i
}
}
}
return pairs
}
func longestValidParentheses(s string) int {
if len(s) <= 1 {
return 0
}
dp := make([]int, len(s))
dp[0] = 0
for i := 1; i < len(s); i++ {
if n := endLongerst(s[:i+1]); n > dp[i-1] {
dp[i] = n
} else {
dp[i] = dp[i-1]
}
}
return dp[len(s)-1]
}
func main() {
fmt.Println(longestValidParentheses(")()())()()("))
}
复杂度分析
time
O(n**2)
space
O(n)
执行结果
执行用时 :4 ms, 在所有 golang 提交中击败了52.31%的用户
内存消耗 :3 MB, 在所有 golang 提交中击败了61.70%的用户