Description
给出一个字符串,求该字符串的一个子串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
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stack>
#include <algorithm>
#include <stack>
#include <vector>
#define MAX 0x3f3f3f3f
using namespace std;
char s[111111];
int main()
{
int l=0,t=0,a[1000],sum=0,ans=MAX,flag=0;
memset(a,0,sizeof(a));
cin >> s;
for(int i=0;s[i];i++)
{
if(a[s[i]]==0)
t++; // t记录已经有了几种字母
a[s[i]]++; //a[ ]记录每种字母有多少个
while(t==26)
{
flag=1;
ans=min(ans,i-l+1);
a[s[l]]--;
if(a[s[l]]==0) //当a[ ]为0时,便少了一种字母,所以 t 要减去 1
t--;
l++;
}
}
if(!flag)
cout << "No Solution" <<endl;
else
cout << ans <<endl;
return 0;
}