运用双指针,如果不符合条件,将第二个指针向右移,符合条件后,再把第一个指针向右移,直到刚好满足,这样记录每次刚好符合条件的字串长度,遍历完后取最小值。
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int a[27];
bool check()
{
bool flag=true;
for(int i=0;i<26;i++)
{
if(a[i]==0)
{
flag=false;
break;
}
}
return flag;
}
int main()
{
int minl=1e6,sum=0;
string s;
int cnt=0;
cin>>s;
char *p1=&s[0],*p2=&s[0];
while(p2<&s[s.size()])
{
while(!check())
{
if(p2==&s[s.size()])
goto out;
a[*p2-'a']++;
p2++;
}
while(check())
{
a[*p1-'a']--;
p1++;
}
sum=p2-p1+1;
minl=min(minl,sum);
}
out:
cout<<minl<<endl;
getchar();
getchar();
}


京公网安备 11010502036488号