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

给出一个字符串,求该字符串的一个子串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\n",m);
43     }
44     else
45     {
46         printf("No Solution\n");
47     }
48     return 0;
49 }

 



转载于:https://www.cnblogs.com/wkfvawl/p/9332722.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值