[算法] 最长公共子序列

10 篇文章 0 订阅

问题

  • 一个序列 S S 任意删除若干个字符得到新序列T,则 T T 叫做S的子序列;
  • 两个序列 X X Y的公共子序列中,长度最长的那个,定义为 X X Y的最长公共子序列(LCS,Longest Common Subsequence):
    • 字符串 13455 13455 245576 245576 的最长公共子序列为 455 455
    • 字符串 acdfg a c d f g adfc a d f c 的最长公共子序列为 adf a d f
  • 注意区别最长公共子串(Longest Common Substring)
    • 最长公共子串要求连续

分析

暴力求解法

  • 假定字符串 X X Y的长度分别为 m m n;
  • X X 的一个子序列即下标序列{12...m}的严格递增子序列,因此 X X 共有2m个不同的子序列;同理, Y Y 2n个不同子序列,从而穷举搜索法需要指数时间 O(2m2n) O ( 2 m ∗ 2 n )
  • X X 的每一个子序列,检查它是否也是Y的子序列,从而确定它是否为 X X Y的公共子序列,并且在检查过程中选出最长的公共子序列;

LCS解法探索

LCS的记号
  • 字符串 X X ,长度为m,从1开始数;
  • 字符串 Y Y ,长度为n,从1开始数;
  • Xi=<x1,...,xi> X i =< x 1 , . . . , x i > X X 序列的前i个字符( 1im 1 ≤ i ≤ m )( Xi X i 不妨读作字符串 X X i前缀);
  • Yj=<y1,...,yi> Y j =< y 1 , . . . , y i > Y Y 序列的前j个字符( 1jn 1 ≤ j ≤ n )(字符串 Y Y j前缀);
  • LCS(X,Y) L C S ( X , Y ) 为字符串 X X Y的最长公共子序列,即为 Z=<z1,...,zk> Z =< z 1 , . . . , z k >
    • 注意:事实上, X X Y可能存在多个子串,长度相同并且最大,因此, LCS(X,Y) L C S ( X , Y ) 严格的说,是个字符串集合。即 ZLCS(X,Y) Z ∈ L C S ( X , Y )
若 xm=yn
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值