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

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

Input

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

Outpu

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

Sample Input

BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ

Sample Output

28


尺取法,判断标准是是否含有全部26个字母。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<stack>
 8 #include<deque>
 9 #include<iostream>
10 using namespace std;
11 char con[100009];
12 int main()
13 {
14     int i,p,j,k;
15     int head,tail,ans,flag,big;
16     int check[30]={0};
17     gets(con);
18     k=strlen(con);
19     big=99999999;
20     head=tail=0;
21     flag=1;
22     ans=1;
23     check[con[0]-65]++;
24     while(1)
25     {
26         if(tail>head||head>=k||tail>=k||head<0||tail<0)
27             break;
28         if(flag<26)
29         {
30             head++;
31             ans++;
32             if(check[con[head]-65]==0)
33             {
34                 flag++;
35             }
36             check[con[head]-65]++;
37         }
38         else
39         {
40             if(ans<big)
41                 big=ans;
42             ans--;
43             check[con[tail]-65]--;
44             if(check[con[tail]-65]==0)
45                 flag--;
46             tail++;
47         }
48     }
49     if(big==99999999)
50         printf("No Solution\n");
51     else
52         printf("%d\n",big);
53     return 0;
54 }
View Code

 

posted @ 2018-07-27 09:02  Daybreaking  阅读(125)  评论(0编辑  收藏  举报