动态规划算法2——最长公共子序列

今天,我给大家带来的是“最长公共子序列”(LCS)的讲解。限于水平,这里仅介绍O(nm)算法。

最长公共子序列其实是很好理解的。

顾名思义,给出多个(这里暂且只考虑两个)序列,求他们的最长公共子序列,就是在这两个序列中分别删去一些的字符,得到两个相同的序列,使得这两个相同的序列最长。

当然上面是我自己用比较好理解的方法写的,关于某些“百科”上的解释就是“一个序列S,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则S称为已知序列的最长公共子序列。而最长公共子串(要求连续)和最长公共子序列是不同的 ”。

这里要先牵扯到一个“子序列”的问题。子序列就是一个序列中,删去一些字符后剩下部分。例如,“abc”就是“axbyc”的一个子序列,他相应的子序列在原序列的下标就是“1,3,5”。

再比如,

令字串A为“abcdef”,字串B为“defghi”,那么他们的最长公共子序列是什么呢?

显然,是“def”。因为子串“d”、“e”和“f”长度均为1,子串“de”、“ef”和“df”均为2,只有“def”长度为3。

所以,现在,我们给出两个序列,求他们的最长公共子序列。

 

【输入格式】

共两行。每行给出一个长度不超过200的字符串。

【输出格式】

共两行。第一行一个非负整数表示最长公共子序列的长度。第二行输出这个子序列(若有多解,任意输出一个)。

【输入样例】

ABCBDAB

BDCABA

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值