题目:
难度:Hard
相关话题:字符串
、动态规划
给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
思路:
一般来说,遇到括号问题,首先会想到用stack
,这道题也同样,用stack
保存每一个括号的索引值,每次pop
的时候, 记录最大值。
另外这道题也可以用DP
,DP
的思路是当存在()
,需要+2
,当存在(()())
,需要+2
后再加上第一个(
上的值。
/**
* @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
* @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
let stack=[-1]
let max=0
for(let i=0;i<s.length;i++){
if(s[i]==="("){
stack.push(i)
}else{
if(stack.length>1){
stack.pop()
max=Math.max(max,i-stack[stack.length-1])
}else{
stack[0]=i
}
}
}
return max
// var max = 0;
// var n = s.length;
// var dp = Array(n).fill(0)
// for(var i = 1; i < n; i++){
// if (s[i] === ')' && s[i - 1] === '('){
// dp[i] = (dp[i - 2] || 0) + 2;
// } else {
// if (s[i] === ')' && dp[i - 1] > 0 && s[i - dp[i - 1] - 1] === '('){
// dp[i] = 2 + dp[i - 1];
// dp[i] += (dp[i - dp[i]] || 0)
// }
// }
// max = Math.max(max, dp[i])
// }
// return max;
};