32.最长有效括号

70 阅读1分钟

题目描述

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号

子串的长度。

 

示例 1:

输入: s = "(()"
输出: 2
解释: 最长有效括号子串是 "()"

示例 2:

输入: s = ")()())"
输出: 4
解释: 最长有效括号子串是 "()()"

示例 3:

输入: s = ""
输出: 0

 

提示:

  • 0 <= s.length <= 3 * 104
  • s[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
}

图示

image.png

image.png