这道题要求求出包含所有类型字母的最短连续序列,我采用了尺取法,它一般是反复推进区间的开头和结尾,来求取满足条件的最小区间的方法,比较实用。
AC代码: (耗时62ms)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,sum=0;
cin>>n;
char a[100009];
map<char, int> Map1,m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(!Map1.count(a[i]))
{
sum++;
}
Map1[a[i]]++;
}
int j=1,len=0,now=0,ans=100009;
for(int i=1;i<=n;i++)
{
if(m[a[i]]==0)now++;
m[a[i]]++;
len++;
if(now==sum)
{
if(len<ans)ans=len;
while(now==sum)
{
m[a[j]]--;
if(m[a[j]]==0)now--;
len--;
j++;
if(now==sum)if(len<ans)ans=len;
}
}
}
cout<<ans<<endl;
}