题目:
给你一个只包含 ‘(‘ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
解题:
左括号数量和右括号数量相等的时候,就是一对括号,先有左括号,左边不大于右边的时候,重新计数,取最大值
代码:
func longestValidParentheses(s string) int {
var res int
for i := range s {
tmp := s[i:]
left, right := 0, 0
for j := range tmp {
if tmp[j] == '(' {
left++
}
if tmp[j] == ')' {
if left > right {
right++
} else {
left, right = 0, 0
}
}
if left == right && right > res {
res = right
}
}
}
return res * 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
}
// 栈
func longestValidParentheses(s string) int {
maxAns := 0
stack := []int{}
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 {
maxAns = max(maxAns, i - stack[len(stack)-1])
}
}
}
return maxAns
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
// 不需要额外的空间
func longestValidParentheses(s string) int {
left, right, maxLength := 0, 0, 0
for i := 0; i < len(s); i++ {
if s[i] == '(' {
left++
} else {
right++
}
if left == right {
maxLength = max(maxLength, 2 * right)
} else if right > left {
left, right = 0, 0
}
}
left, right = 0, 0
for i := len(s) - 1; i >= 0; i-- {
if s[i] == '(' {
left++
} else {
right++
}
if left == right {
maxLength = max(maxLength, 2 * left)
} else if left > right {
left, right = 0, 0
}
}
return maxLength
}
func max(x, y int) int {
if x > y {
return x
}
return y
}