查找至少含k个相同字母的子串

题目链接

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
#define maxn 200005
#define ll long long
int ant[maxn][29];
char ch[maxn];
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
   getchar();
   scanf("%s",ch);
   ant[0][ch[0]-'a']=1;
   for(int i=1;i<n;i++)
   {
       for(int j=0;j<26;j++)
        ant[i][j]=ant[i-1][j];
       ant[i][ch[i]-'a']++;
   }
   if(k==1)printf("1\n");
   else{
   int minn=1e9+7;
   for(int i=0;i<26;i++)
   {
       int temp1=0,temp2=0;
       if(ant[n-1][i]<k)continue;
       while(temp1<n&&ant[temp1][i]==0)temp1++;
       while(temp2<n&&ant[temp2][i]<k)temp2++;
       minn=min(minn,temp2-temp1+1);
       for(temp1++;temp1<n;temp1++)
       {
           if(ch[temp1-1]-'a'==i)
           {
               temp2++;
               while(temp2<n&&ch[temp2]-'a'!=i)temp2++;
               if(temp2==n)break;
           }
           minn=min(minn,temp2-temp1+1);
       }
   }
   if(minn==1e9+7)printf("-1\n");
   else printf("%d\n",minn);
   }
   return 0;
}


版权声明:本文为weixin_45502089原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。