题目:32. 最长有效括号
思路:动态规划,时间复杂度0(n)。
C++版本:
class Solution {
public:
int longestValidParentheses(string s) {
int n=s.size();
vector<int> f(n);
//最长有效字符串
int mx=0;
//遍历每一个字符串的右端点
for(int i=1;i<n;i++){
//只有在“)”时,有效字符串长度才可能不为0
if(s[i]==')'){
//判断左边不合法的第一个字符是否为'('。
if(i-f[i-1]-1>=0&&s[i-f[i-1]-1]=='('){
//是的话,可以组成更长的有效字符串
if(i-f[i-1]-2>=0) f[i]=f[i-f[i-1]-2]+2+f[i-1];
else f[i]=2+f[i-1];
}
//维护最长的有效字符串
mx=max(mx,f[i]);
}
}
return mx;
}
};
JAVA版本:
class Solution {
public int longestValidParentheses(String s) {
int n=s.length();
int[] f=new int[n];
int mx=0;
for(int i=1;i<n;i++){
if(s.charAt(i)==')'){
if(i-f[i-1]-1>=0&&s.charAt(i-f[i-1]-1)=='('){
f[i]=2+f[i-1];
if(i-f[i-1]-2>=0) f[i]+=f[i-f[i-1]-2];
}
mx=Math.max(mx,f[i]);
}
}
return mx;
}
}