给出一个字符串,求该字符串的一个子串S,S包含A-Z中的全部字母,并且S是所有符合条件的子串中最短的,输出S的长度。如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution。
Input
第1行,1个字符串。字符串的长度 <= 100000。
Output
输出包含A-Z的最短子串长度。如果没有符合条件的子串,则输出No Solution。
Input示例
BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ
Output示例
28
思路:r先移动,同时用一个数组存下扫过的每个字符的个数,至符合条件(26全)。再移动l根据字符个数判断l-r间的字符串是否符合要求,不符合r继续移动至符合。
注意:l移动的边界,(只需保证字符串个数正确,没必要让l、r一定指向子串的始、终)
代码(復锦巨巨的...):
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e5+100;
#define INF 0x3f3f3f3f
int B[30];
char A[maxn];
int main(){
scanf("%s",A+1);
int l,r;
int L=strlen(A+1);
int i,j,k;
l=1;
r=1;
int ans=INF;
int sum=0;
while(r<=L){
if(B[A[r]-'A']==0) sum++;
B[A[r]-'A']++;
while(sum==26){
ans=min(ans,r-l+1);
B[A[l]-'A']--;
if(B[A[l]-'A']==0) sum--;
l++;
}
r++;
}
if(ans==INF) puts("No Solution");
else printf("%d\n",ans);
return 0;
}