分析:
此题用到了前缀和,能够降低时间复杂度,代码比较容易理解
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstring>
using namespace std;
const int maxn=2e5+100;
int main()
{
int n;
char p[3]={'G','B','R'};
scanf("%d",&n);
while(n--)
{
int l,k;
char s[maxn];
int ans=maxn;
int ant[3][maxn];
ant[0][0]=0;ant[1][0]=0;ant[2][0]=0;
scanf("%d%d",&l,&k);
scanf("%s",s+1);
for(int i=1;i<=l;i++)
{
if(s[i]==p[(i+3)%3])
ant[0][i]=ant[0][i-1];
else
ant[0][i]=ant[0][i-1]+1;
if(s[i]==p[(i+3+1)%3])
ant[1][i]=ant[1][i-1];
else
ant[1][i]=ant[1][i-1]+1;
if(s[i]==p[(i+3+2)%3])
ant[2][i]=ant[2][i-1];
else
ant[2][i]=ant[2][i-1]+1;
}
// printf("ans %d\n",ans);
for(int i=0;i<=l-k;i++)
{
ans=min(ans,ant[0][i+k]-ant[0][i]);
ans=min(ans,ant[1][i+k]-ant[1][i]);
ans=min(ans,ant[2][i+k]-ant[2][i]);
}
printf("%d",ans);
if(n)
printf("\n");
}
return 0;
}
在做这道题时,我在while中定义ant数组,然后memset初始化为0,结果超时了,后面改成了
ant[0][0]=0;ant[1][0]=0;ant[2][0]=0;
就通过了,memset初始化还是有一些耗时的。写代码时,时间复杂度能优化就优化 。