leetcode:467. 环绕字符串中唯一的子字符串(dp)

题目:在这里插入图片描述

分析:

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;
发布了71 篇原创文章 · 获赞 28 · 访问量 2465

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/104159880
今日推荐