JS笔试题 - 最长有效括号子集

628 阅读1分钟

题目:

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

示例 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;
};