题目描述:小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。
输入描述:
一行一个字符串S。只包含小写字母。S的长度不超过106.
输出描述:
一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。
示例
输入
ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu
输出
49
#include<bits/stdc++.h>
#include<algorithm>
#define NUM 1000010
using namespace std;
int main() {
int n;
char str[NUM];
int cnt[300];
scanf("%s", str);
memset(cnt, 0, sizeof(cnt));
n = strlen(str);
int l = 0;
int ans = NUM;
int num = 0;
for (int r = 0; r < n; r++) {
if (cnt[str[r]] == 0)
num++;
cnt[str[r]]++;
while (cnt[str[l]] > 1)
cnt[str[l]]--, l++;
//l~r已存在26个字母
if (num == 26)
ans = min(ans, r - l + 1);
}
printf("%d\n", ans);
return 0;
}