《编程之美》:最长公共子序列(串)

本文详细介绍了求解最长公共子串的两种情况及其算法实现:一种是子串可以不连续,另一种则要求子串必须连续。通过设定矩阵并利用递推公式来找出两个字符串之间的最长公共子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求最长公共子串有两种情况:1, 不要求子串连续,两个字符串BDCABAABCBDAB,字符串BCBA和BDAB都是它们的最长公共子串。2, 要求子串连续。对于上面两个串来说,BD和AB是它们的最长公共子串。
一,有关连续的已经写过。设定一个矩阵p,p[i][j]表示以str1[i]和str2[j]结尾的子串的最大公共子串的长度。所以有递推式:
如果 str1[i] != str2[j], p[i][j] = 0.
如果 str1[i]  = str2[j], p[i][j] = p[i-1][j-1] + 1.
二,如果不要求子串连续,处理有一些小的区别。还是设定一个矩阵p,p[i][j]表示str1[i]和str2[j]之前的子串最大公共子串的长度(不需要一定包含str1[i]或str2[j]),也就是说即使str1[i]和str2[j]不相等,也不能把p[i][j]清零。因为题目要求的子串不一定是连续的。所以这种情况的递推式为:
如果 str1[i] != str2[j], p[i][j] = max(p[i-1][j],  p[i][j-1, p[i-1][j-1]).
如果 str1[i]  = str2[j], p[i][j] = p[i-1][j-1] + 1.
而p[i-1][j-1]肯定小于前两者,所以第一个条件可改为:p[i][j] = max(p[i-1][j],  p[i][j-1])。
为了避免重复计算或者浪费不必要的空间,可以从开始往后递推。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值