leetcode32.最长有效括号
leetcode32.最长有效括号
题目
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
用例
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
输入:s = ""
输出:0
求解
方法一:暴力求法
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
let max_length = 0;
let len = s.length;
for(let i=0;i<len;i++){
let left = 0;
let right = 0;
for(j=i;j<len;j++){
s[j]=="("?left++:right++
if(right>left){
break;
}
if(right==left){
if(max_length<j-i+1){
max_length=j-i+1
}
}
}
}
return max_length
};
方法二:动态规划
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
let max_len = 0;
const len =s.length
//创建dp[i]数组
const dp = new Array(len).fill(0);
for(let i=0;i<len;i++){
if(s[i]=='('){
dp[i]=0
}else if(s[i]==')'){
if(i-1<0){
dp[i]=0
}else{
if(s[i-1]=='('){
if(i-2<0){
dp[i]=2
}else{
dp[i]=2+dp[i-2]
}
}else if(s[i-1]==')'){
if(i-dp[i-1]-1<0||s[i-dp[i-1]-1]==')'){
dp[i]=0
}else{
if(i-dp[i-1]-2<0){
dp[i]=2+dp[i-1]
}else{
dp[i]=2+dp[i-1]+dp[i-dp[i-1]-2]
}
}
}
}
}
if(dp[i]>max_len){
max_len=dp[i]
}
}
return max_len
};
动态规划的思路


浙公网安备 33010602011771号