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.
题目分析:要找到最长的括号匹配,首先第一个要考虑的是匹配的括号能否连起来。我们考虑到后面的括号会影响前面的匹配结果,所以想到用从后往前的动态规划。
具体分析如下:如果遇到'(',我们需要跳过后面已经匹配的括号,找到真正要匹配的位置j,如果匹配,则de[i]=dp[i+1]+2;并且如果j+1<len,则之前的和之后的连起来了dp[i]+=dp[j+1];
具体代码如下:
/*使用动态规划的思想,从后往前一步步规划来进行排序
* 遇到左括号,则需要跳过对应的已经匹配的寻找是否匹配
* 如果匹配的话还可以加上匹配)之前匹配的值
* */
public int longestValidParentheses(String s) {
int len=s.length();
if(len<=1) return 0;
int[] dp=new int[len];
int max=0;
for(int i=len-2;i>=0;i--)
{
char c=s.charAt(i);
if(c=='(')
{
int j=i+1+dp[i+1];
if(j<len&&s.charAt(j)==')')
{
dp[i]=dp[i+1]+2;
if(j+1<len)
dp[i]+=dp[j+1];
}
}
if(dp[i]>max)
max=dp[i];
}
return max;
}