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