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 <stdlib.h>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <ctime>
#define maxn 10007
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lowbit(x) (x&(-x))
#define eps 0.00000001
using namespace std;
typedef long long ll;
char a[111111];
int s[500];
int main()
{
cin>>a;
int l=strlen(a);
int i=0,j=0,sum=0,now=INF;
while(j<l)
{
if(sum<26)//判断是否26个字母是否都出现过
{
s[a[j]]++;
if(s[a[j]]==1)
sum++;
}
j++;
if(sum==26)//当26个字母都出现了,开始缩小范围判断最小范围
{
now=min(now,j-i);
while(sum==26)
{
s[a[i]]--;
if(!s[a[i]])
sum--;
now=min(now,j-i);
i++;
}
}
}
if(now==INF)
cout<<"No Solution"<<endl;
else
cout<<now<<endl;
return 0;
}