题目链接:https://ac.nowcoder.com/acm/contest/3002/G
思路:
第一维为26个字母,第二维度为该字符出现的次数,a[a~z][N]的值为该字符第N次出现的位置。后枚举作差取最小。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+5;
char q[maxn];
int a[26][maxn]; ///一维为字母,二维该字母出现末次时表示出现的位置
#define inf 0x3f3f3f
int main()
{
int n,k;
scanf("%d%d",&n,&k);
scanf("%s",q+1);
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
int c=q[i]-'a';
a[c][0]++;
a[c][a[c][0]]=i;
}
int ans=inf;
for(int i=0;i<26;i++)
{
for(int j=k;j<=a[i][0];j++) ///枚举每一个符合(在字串中出现次数>=k)的字母
{
int l=a[i][j]-a[i][j-k+1]+1; ///符合条件的字母出现k次时子串的长度
ans=min(l,ans);
}
}
if(ans==inf) printf("-1\n");
else printf("%d\n",ans);
}