Offer 驾到,掘友接招!我正在参与 2022 春招打卡活动,点击查看活动详情。
一、题目描述:
- 最长有效括号 —— 难度困难
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 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
}
四、总结:
这道题有了思路之后,比之前的中等难度题还要简单,毕竟遍历能解决的事情都是小事情。
加油吧!