最长有效括号
线性 DP 进阶题:`dp[i]` 表示以 i 结尾的最长有效括号长度。
#resource / algorithm
#type / snippet
#status / growing
#source / leetcode
#algo / dp
最长有效括号
题目链接:https://leetcode.cn/problems/longest-valid-parentheses/
状态
dp[i] 表示以 s[i] 结尾的最长有效括号长度。
转移
只有当 s[i] === ')' 时,才可能形成有效括号。
分两种情况:
...():如果s[i - 1] === '('...)):如果s[i - 1] === ')',就去找前一个有效串左边能不能接上一个'('
JavaScript
var longestValidParentheses = function(s) {
const n = s.length;
const dp = new Array(n).fill(0);
let ans = 0;
for (let i = 1; i < n; i++) {
if (s[i] === ')') {
if (s[i - 1] === '(') {
dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
} else {
const pre = i - dp[i - 1] - 1;
if (pre >= 0 && s[pre] === '(') {
dp[i] = dp[i - 1] + 2 + (pre >= 1 ? dp[pre - 1] : 0);
}
}
ans = Math.max(ans, dp[i]);
}
}
return ans;
};