题目链接
https://www.nowcoder.com/acm/contest/161/A
题意
小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。
题解
尺取法。
枚举区间的较高效的方法。
先初始化区间为[0,-1].
然后找到右区间r,使得区间[l,r]合法。
蠕动左区间l,使得区间[++l,r]合法。
不停的蠕动左右区间。
AC代码
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=1e6+7;
int a[26];//每个字母的个数
string s;
bool valid()
{
for(int i=0;i<26;i++)
if(a[i]==0) return false;
return true;
}
int main()
{
while(cin>>s)
{
memset(a,0,sizeof(a));
int l=0,r=-1,ans=INF;
for(int i=0;i<s.size();i++)
{
++r;
a[s[r]-'a']++;
//for(int i=0;i<26;i++)
// cout<<a[i]<<" ";
// cout<<endl;
while(valid())
{
ans=min(ans,r-l+1);
a[s[l]-'a']--;
l++;
}
}
cout<<ans<<endl;
}
return 0;
}