题目 :给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
(()) , ()() 这两种情况都表示匹配
解题思路:运用动态规划,需要考虑的情况有以下几种:
-
字符 ’ ( ’ 的dp值一定是0
而对于’)’ 则要分情况进行讨论:因为是要讨论s[i-1]的情况所以i需要从1开始
-
当s[i-1]==’ ( ’ 时,dp[i]=dp[i-2]+2;//但是这里需要注意的是,如果i等于1的情况即’()'时,i-2就越界了,所以i必须大于等于2,当大于2时,转移方程为:dp[i] = dp[i-2]+2,否则dp[i]=2,对应于()这种情况;
-
当s[i-1]==’ ) ’ 时,这个情况就有点复杂,首先要判断i-dp[i-1]>0 ,即还有东西可以和他匹配,s[i-dp[i-1]-1]是否为’(’ ,否则dp[i]为0.
-
然后判断 i-dp[i-1] 是否是大于 2 ,大于2时,说明前面还有例如()(()()),小于2时例如(()()) ,前一种情况dp[i]=dp[i-1]+dp[i-dp[i-1]-2] +2 , 后一种情况dp[i]=dp[i-1]+2;
-
在循环判别的过程中取dp的最大值即可。
代码如下:
class Solution {
public int longestValidParentheses(String s) {
int length=s.length();
int [] dp=new int[length];
char[] list=s.toCharArray();
int rs=0;
for(int i=1;i<length;i++){
if(list[i]==')'){
if(list[i-1]=='('){
dp[i]= (i>=2 ? dp[i-2]:0) +2;
}else if(i-dp[i-1]>0&&list[i-dp[i-1]-1]=='('){
dp[i]=dp[i-1]+(i-dp[i-1]>=2?dp[i-dp[i-1]-2]:0)+2;
}
}
rs=Math.max(rs,dp[i]);
}
return rs;
}
}