zoukankan      html  css  js  c++  java
  • Wannafly挑战赛23 A 字符串

    题目描述 

    小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。

    输入描述:

    一行一个字符串S。只包含小写字母。S的长度不超过106.

    输出描述:

    一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。
    示例1

    输入

    复制
    ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu

    输出

    复制
    49

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstdlib>
     5 #include <cstring>
     6 #include <string>
     7 #include <deque>
     8 #include <set>
     9 #include <queue>
    10 using namespace std;
    11 #define  ll long long 
    12 #define  N 1000009
    13 #define  gep(i,a,b)   for(int  i=a;i<=b;i++)
    14 #define  gepp(i,a,b)  for(int  i=a;i>=b;i--)
    15 #define  gep1(i,a,b)  for(ll i=a;i<=b;i++)
    16 #define  gepp1(i,a,b) for(ll i=a;i>=b;i--)    
    17 #define  mem(a,b)  memset(a,b,sizeof(a))
    18 #define  P  pair<int,int>u+
    19 char s[N];
    20 int loc[30];
    21 int  main()
    22 {
    23     scanf("%s",s);
    24     int l=0;
    25     int len=strlen(s);
    26     int ans=len+1;
    27     mem(loc,-1);
    28     int cnt=0;
    29     //只要[l,i]区间里含有26个字母即可
    30     gep(i,0,len-1)
    31     {
    32      if(loc[s[i]-'a']==-1)
    33      {
    34          cnt++;
    35      }        
    36        loc[s[i]-'a']=i;//该字母最大的坐标
    37       while(l<loc[s[l]-'a'])  l++;//后面有了,那么前面的就可以不用了,l++。减小去区间长度
    38       if(cnt==26)
    39       {
    40           ans=min(ans,i-l+1);
    41       }
    42     }
    43     printf("%d
    ",ans);
    44     return 0;
    45 }
  • 相关阅读:
    二极管常用
    金属化孔与非金属化孔
    电容~3.钽电容
    电感~2.电路分析
    交流整流之后
    电容~2.电路分许
    三极管~3常见电路
    三极管~2.电路分析
    名词解释
    硬件设计
  • 原文地址:https://www.cnblogs.com/tingtin/p/9568631.html
Copyright © 2011-2022 走看看