愿各位程序员都能记住,输出第一条hello world时候的心情。坚持下去,你的每一条代码都在默默的改变世界,加油!加油!加油! “这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。 什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。 人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。

糖果 【字符贪心】

题目

糖果
(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有数,证明出现了相同的字母,此时重新找LL就为当前的位置减去距离此相同字母的上一个位置因为可能存在多个字母,所以在这里我们一定要取最小值才可能保证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 }

 

posted @ 2019-10-14 20:10  max_lemon  阅读(1006)  评论(0编辑  收藏  举报
Live2D
别人恋爱不成功,你连暗恋都不成功! 你写不出代码的原因只有一个,那就是你没有彻底理解这个算法的思想!!-----沃茨·基硕德