/**
* @param {string} s
* @return {number}
*/varlongestValidParentheses=function(s){var len = s.length;if(len<=1)return0;if(len===2){if(s[0]=='('&&s[1]==')')return2;elsereturn0;}//save the longest valid parenthese numbers at each position of the stringvar dp =newArray(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}
*/varlongestValidParentheses=function(s){var len = s.length;if(len===0)return0;var maxValidLength =0;var stack =newArray();// create empty array
stack.push(-1);for(let i =0; i < len; i++){if(s[i]=='('){
stack.push(i);}else{// right parenthesisvar 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}
*/varlongestValidParentheses=function(s){var len = s.length;if(len===0)return0;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;}elseif(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;}elseif(left > right){
left =0;
right =0;}}return maxValidLength;};