32_最長有效括號JavaScript
阿新 • • 發佈:2021-01-15
方法一:動態規劃
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
var len = s.length;
if (len<=1)
return 0;
if (len===2)
{
if (s[0]=='('&&s[1]==')')
return 2;
else
return 0;
}
//save the longest valid parenthese numbers at each position of the string
var dp = new Array(len).fill(0);
for(let i = 1; i < len; i++)
{
if(s[i]==')')
{
if(s[i-1]=='(')
{
if(i>=2)
{
dp[ i] = dp[i - 2] + 2;
}else{
dp[i] = 2;
}
}else{ //s[i-1]=')'
if((i - dp[i - 1] - 1)>=0 && s[i - dp[i - 1] - 1] == '(')
{
if((i - dp[i - 1] - 2)>=0)
dp[ i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2;
else
dp[i] = dp[i - 1] + 2;
}else{
dp[i] = 0;
}
}
}
}
return Math.max(...dp);
};
方法二:棧
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
var len = s.length;
if(len===0)
return 0;
var maxValidLength = 0;
var stack = new Array(); // create empty array
stack.push(-1);
for(let i = 0; i < len; i++){
if(s[i]=='('){
stack.push(i);
}
else{ // right parenthesis
var top = stack.pop();
if((top==-1)||(s[top]==')'))
{
stack.push(i);
}
else // s[top]='('
{
var nextTop = stack.pop();
let tempValidLength = i - nextTop;
if (tempValidLength>maxValidLength)
{
maxValidLength = tempValidLength;
}
stack.push(nextTop);
}
}
}
return maxValidLength;
};
方法三:正反遍歷
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
var len = s.length;
if(len===0)
return 0;
var left = 0, right = 0;
var maxValidLength = 0;
for(let i = 0; i < len; i++)
{
if(s[i]=='(')
left++;
else
right++;
if(left==right)
{
let tempValidLength = 2 * left;
if(tempValidLength > maxValidLength)
maxValidLength = tempValidLength;
}
else if(right > left)
{
left = 0;
right = 0;
}
}
left = 0;
right = 0;
for(let i = len - 1; i >= 0; i--){
if(s[i]=='(')
left++;
else
right++;
if(left==right)
{
let tempValidLength = 2 * left;
if(tempValidLength > maxValidLength)
maxValidLength = tempValidLength;
}
else if(left > right)
{
left = 0;
right = 0;
}
}
return maxValidLength;
};