题目描述
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
我的思路:
1:一个左括号和一个右括号才能组成一对括号
2:连续括号的有效匹配括号个数一定是偶数个,因此i位置出现一个右括号以后,若前面连续出现括号个数为n,那么只有当i-n-1的位置为左括号才是连续匹配的
3:假设dp[i]为到i位置的本次最大连续有效括号长度
i是右括号的时候进行匹配,两种情况 :
1.i-1为左括号 这时候有效长度就是dp[i-2]+2
2.i-1为右括号这时候需要去匹配[i-dp[i-1]-1]是否为左括号,如果是,表明是连续的否则就是没匹配到左括号不连续
我的代码:
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
// 动态规划dp[i]到i位置的最大连续有效括号长度
// i是右括号的时候进行匹配,两种情况
// 1.i-1为左括号 这时候有效长度就是dp[i-2]+2
// 2.i-1为右括号这时候需要去匹配[i-dp[i-1]-1]是否为左括号,如果是,表明是连续的否则就是没匹配到左括号不连续
let dp = [],
max = 0;
// 边界条件
dp[-1] = 0;
dp[0] = 0;
for(let i=1;i<s.length;i++){
// 初始化
dp[i] = 0;
if(s[i] === ')'){
if(s[i-1]==='('){
dp[i] = dp[i-2]+2;
}else{
if(s[i-dp[i-1]-1]==='('){
dp[i] = dp[i-dp[i-1]-2] + dp[i-1] + 2;
}
}
}
max = Math.max(max,dp[i])
}
return max;
};