1、问题描述
找出一个只包含”(“和”)”的字符串中最长的有效子字符串的长度。有效的意思是指该子字符串中的括号都能正确匹配。
例1:
Input: "(()"
Output: 2
例2:
Input: ")()())"
Output: 4
2、思想
利用动态规划的思想,维护一个一维数组,可以构建一个longest[]数组记录对应下标位置的最长有效括号长度,例如,longest[2],记录的是下标2处的最长有效括号长度。
状态转移方程如下:
假设字符数组为s。
s[i] = '('或i=0时,f(i)=0;
s[i]=')'时,如果s[i-f[i-1]-1]='(', f[i]=f[i-f[i-1]-2]+f[i-1]+2;
如果s[i-f[i-1]-1]=')', f[i]=0;
3、代码
class Solution {
public int longestValidParentheses(String s) {
char [] c = s.toCharArray();
int [] f = new int[c.length];
int sum = 0;
for(int i=0;i<c.length;i++){
if(i==0 || c[i]=='('){
f[i] = 0;
if(f[i] > sum){
sum = f[i];
}
continue;
}
if((i-f[i-1]-1)>=0){
if(c[i]==')' && c[i-f[i-1]-1]==')'){
f[i] = 0;
}else if(c[i]==')' && c[i-f[i-1]-1]=='('){
if((i-f[i-1]-2) >= 0){
f[i] = f[i-f[i-1]-2]+f[i-1]+2;
}else{
f[i] = f[i-1] + 2;
}
}else{
f[i] = 0;
}
}else{
f[i] = 0;
}
if(f[i] > sum){
sum = f[i];
}
}
return sum;
}
}