给出一个字符串,求该字符串的一个子串S,S包含A-Z中的全部字母,并且S是所有符合条件的子串中最短的,输出S的长度。如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution。
Input
第1行,1个字符串。字符串的长度 <= 100000。
Output
输出包含A-Z的最短子串长度。如果没有符合条件的子串,则输出No Solution。
Input示例
BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ
Output示例
28
解题思路:
借助尺取法。
My Code:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int MAXN = 1e5+5;
char str[MAXN];
int sum[30];
int main()
{
while(~scanf("%s",str))
{
memset(sum , 0, sizeof(sum));
int len = strlen(str);
for(int i=0; i<len; i++)
{
if(str[i]<='Z' && str[i]>='A')
sum[str[i]-'A']++;
}
bool ok = 0;
for(int i=0; i<26; i++)
if(!sum[i])
{
puts("No Solution");
ok = 1;
break;
}
if(ok)
continue;
memset(sum, 0, sizeof(sum));
int l = 0, r = 0, cnt = 0, Min = 9999999;
while(r<len || cnt==26)
{
while(r<len && cnt<26)
{
if(!sum[str[r]-'A'])
{
cnt++;
}
sum[str[r]-'A']++;
r++;
}
while(sum[str[l]-'A'] > 1)
{
sum[str[l]-'A']--;
l++;
}
if(cnt == 26)
Min = min(Min, r-l);
cnt--;
sum[str[l++]-'A']--;
}
cout<<Min<<endl;
}
return 0;
}