问题:最长有效括号
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
算法:DP
思路:
看了题解:
定义A[i]:其中第i个元素表示以下标为i的字符结尾的最长有效子字符串的长度。
那么最后遍历查找最大值即可。
A[i]为(:值为0、
A[i]为):分两种情况:
(1)I-1为(:则A【i】=A【i-2】+2;
(2)i-1为):[i]=A[i-1]+A[i-A[i-1]-2]+2 前提:A【i-1】>0.A[i-A[i-1]-1]为(
感觉这个方程给的太好了,思路也好,自己还是太菜。
代码:
int main()
{
int A[1000];
string s;
cin>>s;
memset(A,0,sizeof(A));
for(int i=1;i<s.length();i++)
{
if(s[i]=='(') continue;
if(s[i-1]=='(')
{
int c=0;
if(i-2>=0) c=A[i-2];
A[i]=c+2;
}
else if(s[i-1]==')')
{
if(i-2<0 || A[i-1]==0) continue;
int c=0;
if(i-2-A[i-1]>=0) c=A[i-2-A[i-1]];
if(i-1-A[i-1]>=0 && s[i-1-A[i-1]]=='(')
A[i]=A[i-1]+2+c;
}
}
int maxx=-1;
for(int i=0;i<s.length();i++)
{
cout<<A[i]<<endl;
}
}