我是如何嫖大佬题解的
//随便找一个字符串,比如abcdcbef,按照算法自己模拟一遍就恍然大悟了!
18行是核心

嫖了别人的一个解答,
#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
char s[N];
int alp[26];

int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    scanf("%s",s);

    int ans=N;
    for(int i=0,j=0;i<n;i++){
        int x=s[i]-'a';
        alp[x]++;//当前字母出现的次数
    //非常巧妙地算法!记住!虽然还不是很理解 
        while(alp[x]==k && s[j]!=s[i] || alp[x]>k)
             alp[s[j++]-'a']--;//j记录初始k头 
        //如果出现第k次,就不断地从前面朝后减1,直到找到头、
        //道理就在于,头之前的那些字母都可以舍去了 
        //出现第k+1次 ,那一个字母自己比较,就不用找头 
//abcdcbef自己模拟一遍就恍然大悟了!
        if(alp[x]>=k)  
            ans=min(ans,i-j+1);
        //这个字母还没到k次,就不计算 
    }
    if(ans==N)  
        ans=-1;
    printf("%d",ans);
    return 0;
}