题目描述
小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。
输入描述:
一行一个字符串S。只包含小写字母。S的长度不超过106.
输出描述:
一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。
示例1
输入
ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu
输出
49
解题代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000000+100;
char ch[maxn];
int cnt[30];
bool check(){
for(int i=0;i<26;i++) if(!cnt[i]) return false;
return true;
}
int main(){
scanf("%s",ch);
int len=strlen(ch);
int l=0,r=0;
int Min=len;
while(r<len){
while(!check() && r<len) cnt[ch[r++]-'a']++;
while(check()) cnt[ch[l++]-'a']--;
if(r<=len) Min=min(Min,r-l+1);
}
printf("%d\n",Min);
}