题目:
给定两个字符串a、b,现有k次机会对字符串中的字符进行修改,使修改后两个字符串的最长公共子串最长。每一次修改,可以选择a、b字符串中某一个串的任意位置修改成任意字符。
输入格式:
第一行包括一个正整数 k。
第二行和第三行分别输入字符串a、b。(每个串的长度不超过500)
输出格式:
输出为一个整数,表示修改后的两个串的最长公共子串长度。
输入样例:
5
aaaaa
bbbbb
输出样例:
5
题目给的样例具有很大的特殊性
这里给出一组样例用来说明代码思路:
3
1234
0789
过程模拟:
1 234→12 34→123 4
0 789→17 89→128 9→123 4 此时最长子串长度为3
1 2 34→1 23 4→1 234
0 789→27 89→238 9→234 9 此时最长子串长度为3
12 3 4→12 34 →i+q==la 结束判断,此时2<3,最长子串长度仍为3
0 789→37 89→34 89
123 4→i+q==la 结束判断,此时1<3,最长子串长度为3
0 789
#include<iostream>
#include<string>
using namespace std;
int main()
{
int k,num=-1,q,f;
string a,b;
cin>>k>>a>>b;
int la=a.length();
int lb=b.length();
for(int i=0;i<la;i++)
for(int j=0;j<lb;j++)
{
q=0;f=0;//每次都要置零
while(i+q<la&&j+q<lb&&(a[i+q]==b[j+q]||f<k))
{
if(a[i+q]!=b[j+q])
f++;// f 是修改了多少次
q++;// q 是子串的长度
}
if(q>num)//新的子串长度是否大于上一条?
num=q;//大于上一条就更新最长子串的长度
}
cout<<num;
return 0;
}