链接:https://www.nowcoder.com/acm/contest/161/A
来源:牛客网
题目描述
小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。
输入描述:
一行一个字符串S。只包含小写字母。S的长度不超过106.
输出描述:
一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。
示例1
输入
复制
ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu
输出
复制
48
思路:题目就不多说了。思路就是便找边维护,始终维护最小的。详细见代码
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
int num[40];
int ans=99999999;
int i=0,j=0;
int haha;
int countt=0;
memset(num,0,sizeof(num));
cin>>s;
/// cout<<"s.length():"<<s.length()<<endl;
for(i=0;i<s.length();i++){
haha=s[i]-'a'+1;
if(num[haha]==0){
++countt;
}
num[haha]++;
while(1){
haha=s[j]-'a'+1;
if(num[haha]>=2)
{
j++;
num[haha]--;
}
else
break;
}
if(countt==26 ){
/// cout<<"i:"<<i<<" j:"<<j<<endl;
ans=min(ans,i-j+1);
}
}
cout<<ans<<endl;
}
/*
ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestuv
*/