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