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\n",ans);
44     return 0;
45 }

猜你喜欢

转载自www.cnblogs.com/tingtin/p/9568631.html
今日推荐