最短的包含字符串 (尺取)

给出一个字符串,求该字符串的一个子串s,s包含A-Z中的全部字母,并且s是所有符合条件的子串中最短的,输出s的长度。如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution。

 

Input

第1行,1个字符串。字符串的长度 <= 100000。

Output

输出包含A-Z的最短子串s的长度。如果没有符合条件的子串,则输出No Solution。

Sample Input

BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ

Sample Output

28

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define inf 0x3f3f3f3f
 5 using namespace std;
 6 int main()
 7 {
 8     int i,len;
 9     char s[100010];
10     int vis[100010];
11     int r,l,sum,m;
12     memset(vis,0,sizeof(vis));
13     scanf("%s",s);
14     len=strlen(s);
15     memset(vis,0,sizeof(vis));
16     r=l=sum=0;
17     m=inf;
18     while(r<len||sum==26)
19     {
20         while(r<len&&sum<26)
21         {
22             if(vis[s[r]-'A']==0)
23             {
24                 sum++;///记录出现的26个字母种类
25             }
26             vis[s[r]-'A']++;///记录每一种出现的个数
27             r++;///右端点的扩张
28         }
29         if(sum==26)
30         {
31             m=min(m,r-l);
32         }
33         vis[s[l]-'A']--;
34         if(vis[s[l]-'A']==0)
35         {
36             sum--;
37         }
38         l++;///左端点的扩张
39     }
40     if(m!=inf)
41     {
42         printf("%d
",m);
43     }
44     else
45     {
46         printf("No Solution
");
47     }
48     return 0;
49 }


原文地址:https://www.cnblogs.com/wkfvawl/p/9332722.html