题目:
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
分析:
- 字符串合法的前提是左括号数量等于右括号的数量,且 左括号在前,右括号在后。
- 本题不涉及其他字符,所以相对容易一点。可以分别对左右括号计数,并判断当前两者的差值。
- 从左向右遍历,一旦出现右括号数量多于左括号,说明右括号出现在左括号的前面;反之,从右向左遍历,一旦出现左括号数量多于右括号,说明左括号出现在右括号的后面。
完整代码:
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
let maxLength = 0;
let left = 0, right = 0;
for (let i = 0; i < s.length; i++) {
if (s[i] === '(') {
left++;
} else {
right++;
}
if (left - right < 0) {
left = right = 0;
} else if (left === right) {
maxLength = Math.max(maxLength, left + right);
}
}
left = right = 0;
for (let i = s.length - 1; i >= 0; i--) {
if (s[i] === '(') {
left++;
} else {
right++;
}
if (left - right > 0) {
left = right = 0;
} else if (left === right) {
maxLength = Math.max(maxLength, left + right);
}
}
return maxLength;
};