糖果 【字符贪心】
题目:
糖果
(candy.cpp/in/out 1s 256M)
小民是一个很喜欢吃糖果的小孩子,他给所有的糖果进行了分类,有A~Z一 共26种糖果,现在小民有一排糖果,小
民很奇怪,吃糖果只喜欢吃连续的若干个 ,并且不希望吃到相同分类的糖果。现在小民让你帮他计算一下L的最大
值,使得他的一排糖果中的任意连续L个糖果都不会有相同的分类。
Input
输入仅一行,一行由大写字母组成的字符串,代表小民的一排糖果。
Output
输出仅一行,输出L的最大值。如果一排糖果都没有相同的,请输出-1。
Sample Input
ABABABABABAB
Sample Output
2
令字符串的长度为N ,1≤N≤10000000。
(弱鸡)的我连题目意思都没理解清楚,看来理解力得继续加强
题目大意:找出连续一段L,使在L内所有字母互不相同,并尽量使L最大。
把每个字符都固定其特定的位置,一遍扫过去,把他们记录在vis中。若vis为0,则一直没有出现相同字母,持续累加ans。若vis有数,证明出现了相同的字母,此时重新找L,L就为当前的位置减去距离此相同字母的上一个位置,因为可能存在多个字母,所以在这里我们一定要取最小值,才可能保证L内字母互不相同
code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e7+1; 4 char s[N]; 5 int n,ans,flag=1,vis[N]; 6 inline int read(){ 7 int x=0,f=1;char ch=getchar(); 8 while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();} 9 while(isdigit(ch)){x=x*10+ch-48;ch=getchar();} 10 return x*f; 11 } 12 int main(){ 13 scanf("%s",s+1); 14 n=strlen(s+1); 15 for(int i=1;i<=n;i++){ 16 int u=s[i]-'A'+1; 17 if(vis[u]){ 18 ans=min(ans,i-vis[u]); 19 flag=0; 20 } 21 if(flag){ 22 ans++; 23 } 24 //cout<<"i= "<<i<<" vis[u]= "<<vis[u]<<" U= "<<u<<" flag= "<<flag<<" ans= "<<ans<<endl; 25 vis[u]=i; 26 27 } 28 if(ans==n){ 29 printf("-1\n"); 30 } 31 else{ 32 printf("%d\n",ans); 33 } 34 return 0; 35 }