代码如下:
#include <bits/stdc++.h>
using namespace std;
string s1 = "RGB";
string s2 = "BRG";
string s3 = "GBR";
int main(){ //KMP,参考暴风算法;
int test; //因为无论 k 是多少,在substring of the infinite string "RGBRGBRGB...."中只有三种子串;
cin >> test; //所以,在这三种子串中 KMP 匹配,然后计算字串 每次比较的 次数sum, 得出最小的sum1; 然后在ans1 ans2 ans3取最小即可解出此题
while(test--){
int len,k,i,j;
char a[2000];
cin >> len >> k >> a;
int ans1 = 100000000,ans2 = 100000000,ans3 = 100000000;
for(i = 0;i <= len-k;i++){
int sum1 = 0,sum2 = 0,sum3 = 0,bb = 0,cc = 0,dd = 0;
for(j = i;j < i+k;j++){
if(k >= 3){
if(a[j] != s1[j%3]) sum1++; //假设换掉
if(a[j] != s2[j%3]) sum2++;
if(a[j] != s3[j%3]) sum3++;
}else{
if(a[j] != s1[bb++%k]) sum1++;
if(a[j] != s2[cc++%k]) sum2++;
if(a[j] != s3[dd++%k]) sum3++;
}
}
//更新答案
ans1 = min(ans1,sum1);
ans2 = min(ans2,sum2);
ans3 = min(ans3,sum3);
}
cout << min(min(ans1,ans2),ans3) << endl;
}
return 0;
}