题目描述
Given a string containing just the characters'('and')', find the length of the longest valid (well-formed) parentheses substring.
For"(()", the longest valid parentheses substring is"()", which has length = 2.
Another example is")()())", where the longest valid parentheses substring is"()()", which has length = 4.
方法一:利用栈存储”(“的下标。
用一个bool数组来标记已经匹配过的字符,找到最长的连续标记的长度就是所求的结果。只要遍历两遍数组,时间复杂度为O(n)。
import java.util.*;
public class Solution {
public int longestValidParentheses(String s) {
if(s == null||s.length() < 2)
return 0;
Stack<Integer> stack=new Stack();
boolean[] flag=new boolean[s.length()];
char[] ch=s.toCharArray();
for(int i=0;i<ch.length;i++)
{
if(ch[i] == '(')
{
stack.push(i);
}
else if(ch[i] == ')')
{
if(!stack.empty())
{
flag[stack.pop()]=true;//stack储存‘(’的下标;
flag[i]=true;
}
}
}
int count=0;
int num=0;
for(int i=0;i<flag.length;i++)
{
if(flag[i] == true)
{
count++;
if(count>num)
{
num=count;
}
}
else
{
count=0;
}
}
return num;
}
}
方法二:DP
dp[i]的值为以s.charAt(i)结尾的最长的有效括号子串长度。
import java.util.*;
public class Solution {
public int longestValidParentheses(String s) {
if(s == null||s.length() < 2)
return 0;
//dp[i]存放以s.charAt(i)结尾的最长的length
int[] dp=new int[s.length()];
for(int i=1;i<s.length();i++)
{
if(s.charAt(i) == '(')
dp[i]=0;
if(s.charAt(i) == ')')
{
int pre=i-dp[i-1]-1;
if(pre>=0&&s.charAt(pre) == '(')
{
dp[i]=dp[i-1]+2+((pre-1>=0)?dp[pre-1]:0);
}
}
}
int max=0;
for(int i=0;i<dp.length;i++)
{
if(dp[i] > max)
max=dp[i];
}
return max;
}
}