Description
给出一个字符串,求该字符串的一个子串S,S包含A-Z中的全部字母,并且S是所有符合条件的子串中最短的,输出S的长度。如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution。
Input
第1行,1个字符串。字符串的长度 <= 100000。
Output
输出包含A-Z的最短子串长度。如果没有符合条件的子串,则输出No Solution。
Sample Input
BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ
Sample Output
28
题解:
尺取发 qaq
AC代码
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define ll long long
const int mod = 1e9+7;
#define N 100010
#define inf 0x3f3f3f3f
char str[N];
int vis[100];
int main()
{
scanf("%s",str);
int len = strlen(str);
for(int i = 0;i < len; i++) {
if(str[i]>='A'&&str[i]<='Z') {
vis[str[i]-'A']++;
}
}
bool flag = true;
for(int i = 0;i < 26; i++) {
if(vis[i]==0) {
flag = false; break;
}
}
memset(vis,0,sizeof(vis));
int l, r, sum, m = inf;
l = r = sum = 0;
while(r<len || sum==26) {
while(r<len && sum<26) {
if(vis[str[r]-'A']==0) sum++;
vis[str[r]-'A']++;
r++;
}
while(vis[str[l]-'A'] > 1) {
vis[str[l]-'A']--;
l++;
}
if(sum == 26) m = min(m,r-l);
sum--;
vis[str[l]-'A']--;
l++;
}
if(flag)
printf("%d\n",m);
else puts("No Solution");
return 0;
}