Skip to content

No.32 最长有效括号

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

示例 1:

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

示例 2:

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

示例 3:

text
输入:s = ""
输出:0

提示:

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

解题思路

实现

动态规划

dp[i]: 以下标为 i 字符结尾的最长有效括号长度; dp[0...max]=0 有效子串一定以 ) 结尾,以 ( 结尾的子串的 dp = 0,因此只需求解 ) 在 dp 数组中对应位置的值

  1. s[i]=) && s[i-1]=( => dp[i]=dp[i-2]+2
  2. s[i]=) && s[i-1]=) => s[i-dp[i-1]-1]=( => dp[i]=dp[i-1]+dp[i-dp[i-1]-2]+2
js
/**
 * @param {string} s
 * @return {number}
 */
var longestValidParentheses = function (s) {
  let maxLength = 0;
  let dp = new Array(s.length).fill(0);
  for (let i = 0; i < s.length; i++) {
    if (s[i] === ")") {
      if (s[i - 1] === "(") {
        dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
      } else if (
        s[i - 1] === ")" &&
        i > dp[i - 1] &&
        s[i - 1 - dp[i - 1]] === "("
      ) {
        dp[i] =
          (i - dp[i - 1] >= 2 ? dp[i - dp[i - 1] - 2] : 0) + dp[i - 1] + 2;
      }
    }
    maxLength = Math.max(maxLength, dp[i]);
  }
  return maxLength;
};

js
/**
 * @param {string} s
 * @return {number}
 */
var longestValidParentheses = function (s) {};

字符串

js
/**
 * @param {string} s
 * @return {number}
 */
var longestValidParentheses = function (s) {};