码迷,mamicode.com
首页 > 其他好文 > 详细

Wannafly挑战赛23 A 字符串

时间:2018-08-31 23:24:47      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:using   can   ==   一个   有一个   class   ++   tle   字母   

题目描述 

小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 }

 

Wannafly挑战赛23 A 字符串

标签:using   can   ==   一个   有一个   class   ++   tle   字母   

原文地址:https://www.cnblogs.com/tingtin/p/9568631.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!