用邻接表,将对应字母出现的各个位置存下来。
用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; }