双指针(尺取法)
双指针(快慢指针)即可。
右指针先走,一直到满足条件后,维护一下长度的最小值,然后左指针开始右移,直到不满足子串含有所有小写字母,右指针继续右移动。
总的复杂度来说,右指针右移动n次,左指针右移也是n次。
复杂度是On
#include<bits/stdc++.h>
using namespace std;
char s[1000005];
int vis[130];
int main(){
cin>>s+1;
int sum=26,now=0;
int l=1,r=0,mi=1e9,len=strlen(s+1);
while(l<=len){
while(r<len && now<sum){
vis[s[++r]]++;
if(vis[s[r]]==1) ++now;
}
if(now==sum) mi=min(mi,r-l+1);
if(vis[s[l]]==1) now--;
vis[s[l++]]--;
}
cout<<mi;
return 0;
}
京公网安备 11010502036488号