最长公共子序列(LCS)

最长公共子序列(LCS)

最长公共子序列是另一个经典的动态规划问题。
与上节中数字序列的子序列定义相同,在字符串 S 中按照其先后顺序依次取出若干个字符,并将它们排列成一个新的字符串,这个字符串就被称为原字符串的子串。
有两个字符串 S1 和 S2,求一个最长公共子串,即求字符串 S3,它同时为S1 和 S2 的子串,且要求它的长度最长,并确定这个长度。这个问题称为最长公共子序列问题。

与求最长递增子序列一样,首先将原问题分割成一些子问题,用dp[i][j]表示 S1 中前 i 个字符与 S2 中前 j 个字符分别组成的两个前缀字符串的最长公共子串长度。显然的,当 i、j 较小时可以直接得出答案,如 dp[0][j]必等于 0。那么,假设已经求得 dp[i][j](0<=i<x,0<=j<y)的所有值,考虑如何由这些值继而推得 dp[x][y],求得 S1 前 x 个字符组成的前缀子串和 S2 前 y 个字符组成的前缀子串的最长公共子序列长度。

S1[x] = =S2[y],即 S1 中的第 x 个字符和 S2 中的第 y 个字符相同,同时由于他们都是各自前缀子串的最后一个字符,那么必存在一个最长公共子串以 S1[x]S2[y]结尾,其它部分等价于 S1 中前 x-1个字符和S2中前y-1个字符的最长公共子串。所以这个子串的长度比dp[x-1][y-1]又增加 1,即 dp[x][y] = dp[x-1][y-1] + 1。相反的ÿ

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值