Description
经过两年多的算法学习,胖胖的小宋已经成为字符串大师了。
现在隔壁老段给了小宋两个长度都为 n 的字符串,让他来求它们的最长公共子串,但小宋同学感觉题目太简单(因为他已经成为字符串大师了),所以他把题目交给了你来完成,并给你了 k 次修改字母的机会,每次你可以选择其中某个串的某个位置,将其修改成任意字符。你需要合理使用这 k 次修改机会,使得修改之后两个串的最长公共子串最长。既然小宋同学选择了你,那么这个问题也难不倒你。
最长公共子串定义:对于字符串 A:"abcde",字符串 B:"jcdkl",它们的最长公共子串为串 "cd",即长度最长的字符串,且在两个串中都作为连续子串出现过。
Input
第一行包含两个整数 n,k (0<n≤300,0≤k≤n),分别表示字符串的长度和修改次数。
第二行包含一个长度为 n 的仅由小写字符构成的字符串 S。
第三行包含一个长度为 n 的仅由小写字符构成的字符串 T。
Output
输出一行一个整数,即修改完毕之后两个串的最长公共子串的长度。
Sample Input 1
5 0 abcde jcdkl
Sample Output 1
2
Sample Input 2
5 2 aaaaa ababa
Sample Output 2
5
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
int i,j;
#define A 300+5
int main()
{
int n,k;
char a[A],b[A];
cin>>n>>k;
cin>>a>>b;
int max=0,count=0;
int x,y;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(x=i,y=j;x<n&&y<n;x++,y++)
{
if(a[x]!=b[y]) count++;
if(count>k)
{
count=0;
break;
}
if(max<x-i+1) max=x-i+1; //
}
}
}
cout<<max<<endl;
return 0;
}
----------文章感谢学长题解