小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。
输入描述:
一行一个字符串S。只包含小写字母。S的长度不超过106.
输出描述:
一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。
示例1
输入
ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu
输出
49
思路很简单,据说叫做尺取法,后端加入,一段加入致前端可删除,循环删除前端致不可再删。
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
int p[30];
int main()
{
string s;
cin>>s;
int l=s.size();
int ans=1000001;
int cnt=0;
int x=0;
for(int i=0;i<l;i++)
{
if(p[s[i]-'a']==0)
cnt++;
p[s[i]-'a']++;
while(p[s[x]-'a']>1)
{
p[s[x]-'a']--;
x++;
}
if(cnt==26)
{
if(i-x+1<ans)
{
ans=i-x+1;
}
}
}
printf("%d\n",ans);
}