• 糖果 【字符贪心】


    题目

    糖果
    (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
    ");
    30     }
    31     else{
    32         printf("%d
    ",ans);
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    python中如何对数据进行各种排序?
    js原型链
    js局部变量,参数
    计算字符串中每个字符出现次数
    推荐几个web中常用js图表插件
    getElementsByTagName("div")和$("div")区别
    Hadoop集群(第6期)JDK和SSH无密码配置
    Hadoop集群(第5期)SecureCRT使用
    Hadoop集群(第4期)VSFTP安装配置
    /etc/vsftpd/vsftpd.conf
  • 原文地址:https://www.cnblogs.com/nlyzl/p/11673635.html
Copyright © 2020-2023  润新知