小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。
输入描述:
一行一个字符串S。只包含小写字母。S的长度不超过1e6.
输出描述:
一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。
输入
ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu
输出
49
先一个一个统计每个字符出现的次数,同时从前面开始去重,去除重复出现的字符,缩短字符长度,跑一遍就行,O(n)的复杂度
#include <bits/stdc++.h>
#define N 1000010
#define INF 0x3f3f3f3f
using namespace std;
int main()
{
int i,l=0,ans=INF;
int vis[200]={0};
string s;
set<char>myset;
cin>>s;
for(i=0;s[i];i++)
{
myset.insert(s[i]);
vis[s[i]]++;
while(vis[s[l]]>1)
vis[s[l]]--,l++;
if(myset.size()==26)
ans=min(ans,i-l+1);
}
cout<<ans<<endl;
return 0;
}