【力扣刷题记 32】——《最长有效括号》

145 阅读1分钟

Offer 驾到,掘友接招!我正在参与 2022 春招打卡活动,点击查看活动详情

一、题目描述:

  1. 最长有效括号 —— 难度困难

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

示例 1:

输入:s = "(()"

输出:2

解释:最长有效括号子串是 "()"

示例 2:

输入:s = ")()())"

输出:4

解释:最长有效括号子串是 "()()"

示例 3:

输入:s = ""

输出:0  

提示:

0 <= s.length <= 3 * 10^4 s[i] 为 '(' 或 ')'

二、题目和思路分析:

这道题大致一看和之前做的判断括号是否有效的题差不多,不过仔细一瞅发现确实差不多,判断条件里都有有效括号子串。

如果还是用之前的方法遍历双指针解决好像有些不妥,毕竟之前只要判断是否有效,这道题要判断的是有效字串的最大长度,也就是可能有多个有效子串,并且起止位置都不一样。

那么有什么更好的方法呢?

如果定义一个数组,arr[0]赋值为-1作为初始值,然后以不符合子串条件的下标减去它作为我们需要的最大长度即可。

这么想,似乎比之前还要简单。

三、代码:

代码实现如下:

/**
 * @param {string} s
 * @return {number}
 */
var longestValidParentheses = function(s) {
    const arr = [-1]
    let max = 0
    for (let i = 0; i < s.length; i++) {
        if (s[i] === '(') {
            arr.push(i) // 把左括号下标加入数组
        } else { // 右括号
            if (arr.length > 1) { // 有左括号
                arr.pop() // 匹配,则移除对应左括号
                max = Math.max(i - arr[arr.length - 1], max)
            } else { // 左右括号不匹配,重新计算下一个子串
                arr[0] = i // 重新记录新的符合条件的子字符串的起始位置
            }
        }
    }
    return max
}

四、总结:

这道题有了思路之后,比之前的中等难度题还要简单,毕竟遍历能解决的事情都是小事情。

加油吧!

image.png