先从左往右扫描,记录未匹配的左括号数目
从右往左再进行一次相同的扫描,就可以考虑到左括号比右括号多的情况
class Solution {
public int longestValidParentheses(String s) {
int len = s.length();
if(len == 0) return 0;
int ans = 0;
int i = 0, j = 0, num = 0;
for(; j < len; j++){
if(s.charAt(j) == ‘(‘)
num++;
else{
if(num == 0)
i = j + 1;
else {
num--;
if(num == 0)
ans = Math.max(ans, j-i+1);
}
}
}
i = len - 1; j = len - 1; num = 0;
for(;i >= 0; i--){
if(s.charAt(i) == ‘)‘)
num++;
else{
if(num == 0)
j = i - 1;
else {
num--;
if(num == 0)
ans = Math.max(ans, j-i+1);
}
}
}
return ans;
}
}
class Solution {
public int longestValidParentheses(String s) {
int len = s.length();
if(len == 0) return 0;
int[] dp = new int[len];
int ans = 0;
dp[0] = 0;
for(int i = 1; i < len; i++){
if(s.charAt(i) == ‘(‘)
dp[i] = 0;
else if(s.charAt(i-1) == ‘(‘)
dp[i] = 2 + (i >= 2 ? dp[i-2] : 0);
else if(i - dp[i-1] > 0 && s.charAt(i-dp[i-1]-1) == ‘(‘)
dp[i] = dp[i-1] + 2 + (i - dp[i-1] - 2 >= 0 ? dp[i-dp[i-1]-2] : 0);
else dp[i] = 0;
ans = Math.max(ans, dp[i]);
}
return ans;
}
}
原文:https://www.cnblogs.com/xiafrog/p/14403967.html