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

Posted wkfvawl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短的包含字符串 (尺取)相关的知识,希望对你有一定的参考价值。

给出一个字符串,求该字符串的一个子串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 }

 



以上是关于最短的包含字符串 (尺取)的主要内容,如果未能解决你的问题,请参考以下文章

51Nod - 1127 最短的包含字符串

51nod 1127 最短的包含字符串

51Nod1127 最短的包含字符串

[51NOD1127]最短的包含字符串(尺取法)

POJ-3061 Subsequence 二分或尺取

C语言中 输入一个字符串,输出最短的单词 求代码,加急