用邻接表,将对应字母出现的各个位置存下来。
用cnt[ ]数组存每个字母出现的次数。

如果字母出现的次数小于k 那就直接跳过
如果次数>=k 就对邻接表里所有相邻的k个字母遍历
ans 更新最短距离

#include <bits/stdc++.h> 
using namespace std;
typedef long long ll; 
const int INF = 0x3f3f3f3f;
int n,k,cnt[26];
string s;
vector<int>a[26];
int main(){
    cin>>n>>k;
    cin>>s;
    for(int i=0;i<n;i++){
        cnt[s[i]-'a']++;
        a[s[i]-'a'].push_back(i);
    } 
    int ans=INF,flag=0;
    for(int i=0;i<26;i++){
        if(cnt[i]<k) continue;
        flag=1;
        for(int j=0;j<a[i].size()-(k-1);j++){
            int l=j+k-1;
            ans=min(ans,a[i][l]-a[i][j]+1);
        }
    }
    if(!flag) puts("-1");
    else cout<<ans<<endl;
    return 0;
}