每天一道算法题(5)——求2个字符串的最长公共子序列和最长公共子字符串

本文详细介绍了如何求解两个字符串的最长公共子序列和最长公共子字符串,通过思路分析、代码实现及时间复杂度讨论,帮助读者理解这两种问题的解决方法。并提供了递归和矩阵辅助的优化策略。
摘要由CSDN通过智能技术生成
       题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。
       例如:输入两个字符串BDCABA 和ABCBDAB,字符串BCBA 和BDAB 都是是它们的最长公共子串,则

       输出它们的长度4,并打印任意一个子串。


1.思路

         注意最长子序列并不考虑连续性。对于序列str1,str2,设长度为m,n。建立辅助矩阵 c[m][n],定义c[i][j]为子串str1[0-i]与子串str2[0-j]的最长子序列的长度,则c[m][n]的元素满足如下关系:


       即假设求两字符串Xm ={x0, x1,…xm-1}和Yn={y0 ,y1,…,yn-1}的LCS,如果xm-1=yn-1,那么只需求得Xm-1 和Yn-1 的LCS,并在其后添加xm-1(yn-1)即可;如果xm-1≠yn-1,我们分别求得Xm-1 和Y 的LCS 和Yn-1 和X 的LCS,并且这两个LCS 中较长的一个为X 和Y 的LCS。

       首先可以递归的求解。但是考虑到递归过程中的重复计算问题,此处使用辅助矩阵的方法。定义方向矩阵direction[m][n]. 由上叙,求取c[i,j]可能从c[i-1,j-1] 、c[i,j-1]或者c[i-1,j]三个方向计算得到,分别定义方向0,-1,1。

       对direction矩阵反向遍历,当derec

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值