解法一:暴力:
class Solution {
public int longestValidParentheses(String s) {
int maxlen=0;
for(int i=0;i<s.length() && i<s.length()-maxlen;i++){
int cnt1=0,cnt2=0;
for(int j=i;j<s.length();j++){
if(s.charAt(j)=='(')
cnt1++;
else if(s.charAt(j)==')'){
if(cnt1<=cnt2)
break;
else
cnt2++;
}
if(cnt1==cnt2)
if(cnt1*2>maxlen)
maxlen=cnt1*2;
}
}
return maxlen;
}
}
解法二:动态规划
class Solution {
public int longestValidParentheses(String s) {
int len=s.length();
int dp[]=new int[len];
int maxlen=0;
for(int i=1;i<len;i++){
if(s.charAt(i)==')'){
if(s.charAt(i-1)=='('){
if(i>=2)
dp[i]=dp[i-2]+2;
else
dp[i]=2;
}
else{
int pos=i-dp[i-1]-1;
if(pos>=0 && s.charAt(pos)=='('){
if(pos>0)
dp[i]=dp[pos-1]+2+dp[i-1];
else
dp[i]=dp[i-1]+2;
}
}
}
maxlen=Math.max(maxlen,dp[i]);
}
return maxlen;
}
}
解法三:栈+回溯
class Solution {
public int longestValidParentheses(String s) {
Stack<Integer> stack=new Stack<Integer>();
stack.push(-1);
int len=s.length(),maxlen=0;
for(int i=0;i<len;i++){
if(s.charAt(i)=='(')
stack.push(i);
else{
stack.pop();
if(stack.isEmpty())
stack.push(i);
else{
maxlen=Math.max(maxlen,i-stack.peek());
}
}
}
return maxlen;
}
}
解法四:两个计数器+两端扫描
class Solution {
public int longestValidParentheses(String s) {
int len=s.length(),maxlen=0,left=0,right=0;
for(int i=0;i<len;i++){
if(s.charAt(i)=='(')
left++;
else
right++;
if(left==right)
maxlen=Math.max(maxlen,right*2);
else if(left<right){
left=0;
right=0;
}
}
left=0;
right=0;
for(int i=len-1;i>=0;i--){
if(s.charAt(i)==')')
right++;
else
left++;
if(left==right)
maxlen=Math.max(maxlen,2*left);
else if(right<left){
left=0;
right=0;
}
}
return maxlen;
}
}