题目:
分析:
int A[p.size()]; 记录当前的解的个数。
int c=1; 记录连续的数目。
A【i】=A【i-1】+c;
每次判断,连续c+1,不连续赋值为1.
代码1:不判断重复:
int A[p.size()];
A[0]=1;
int c=1;
for(int i=1;i<p.size();i++)
{
if(A[i]-1==A[i-1]||(A[i-1]=='z'&&A[i]=='a')) c++;
else c=1;
A[i]=A[i-1]+c;
}
return A[p.size()-1];
代码二:采用集合去重。
string的str的第二个参数指的是个数而不是结束的下标!!!
int A[p.size()];
A[0]=1;
int c=1;
set<string> s;
s.insert(p.substr(0,1));
for(int i=1;i<p.size();i++)
{
if(p[i]-1==p[i-1]||(p[i-1]=='z'&&p[i]=='a')) c++;
else c=1;
A[i]=A[i-1];
cout<<" --:"<<c<<endl;
for(int j=c-1;j>=0;j--)
{
string ss=p.substr(i-j,j+1);
cout<<i-j<<" "<<j+1<<":"<<ss<<endl;
int size=s.size();
s.insert(ss);
if(s.size()==size) break;
A[i]++;
}
}
结果:超时了!
大佬思路:A[I]表示以i字符为结束字符的最大的长度。累加即可!
哎,自己太菜。
int k=1;
int A[26];
memset(A,0,sizeof(A));
A[p[0]-'a']=1;
for(int i=1;i<p.length();i++)
{
if(p[i]-1==p[i-1]||(p[i-1]=='z'&&p[i]=='a')) k++;
else k=1;
A[p[i]-'a']=max(A[p[i]-'a'],k);
}
int all=0;
for(int i=0;i<26;i++) all+=A[i];
return all;