2-6 最长公共子串(两条子串比较,可修改其中一条)c++

题目:

给定两个字符串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;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值