题目描述
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号
子串的长度。
示例 1:
输入: s = "(()"
输出: 2
解释: 最长有效括号子串是 "()"
示例 2:
输入: s = ")()())"
输出: 4
解释: 最长有效括号子串是 "()()"
示例 3:
输入: s = ""
输出: 0
提示:
0 <= s.length <= 3 * 104s[i]为'('或')'
思路
同时考虑两个方向的合法性是比较困难的,我们分两个方向处理来简化问题;
先从左到右,统计左括号和右括号出现次数,如果右括号数量超过了左括号数量,那么就说明是无效部分了,此时重新统计。(比如 ())(()),前面三个统计完之后,就应该重置计数器)。如果左括号数量等于右括号数量,那么此时找到了一个有效串。
然后从右到左进行相同的操作,最终得到的就是最长的有效串长度了。
代码
func longestValidParentheses(s string) int {
var lnum, rnum, n, ans int
n = len(s)
for i := 0; i < n; i++ {
if s[i] == '(' {
lnum++
} else {
rnum++
}
if lnum == rnum {
ans = max(ans, 2 * lnum)
}
if lnum < rnum {
lnum, rnum = 0, 0
}
}
lnum, rnum = 0, 0
for i := n-1; i >= 0; i-- {
if s[i] == ')' {
rnum++
} else {
lnum++
}
if lnum == rnum {
ans = max(ans, 2 * rnum)
}
if lnum > rnum {
lnum, rnum = 0, 0
}
}
return ans
}