题目:给你一个k和两个字符串,从两个字符串中各选出一个等长的子串,要求这两个子串上相同位置上不同元素的个数不能超过k,求选出的子串的最大长度是多少。
思路:枚举A的子串的起点去匹配B串,枚举B串子串的起点去匹配A串。匹配的时候尺取法去匹配,复杂度O(n^2*T)。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5005;
int k;
char str1[maxn],str2[maxn];
int ans;
void cq(char *s1,char *s2) {
int len=min(strlen(s1),strlen(s2));
int l=0,r=0,cnt=0;
for(int i=0;i<len;i++) {
while(r<len) {
if(s1[r]!=s2[r]) {
if(cnt+1>k) break;
cnt++;
}
r++;
}
ans=max(ans,r-i);
if(s1[i]!=s2[i]) cnt--;
}
}
int main(){
int t;
scanf("%d", &t);
while (t--)
{
ans = 0;
scanf("%d", &k);
scanf("%s%s", str1, str2);
int l = strlen(str1);
for (int i = 0; i < l; i++)
cq(str1 + i, str2); //对第一个字符串进行尺取
l = strlen(str2);
for (int i = 0; i < l; i++)
cq(str2 + i, str1); //对另一个字符串进行尺取
printf("%d\n", ans);
}
return 0;
}