[算法] 最长公共子序列

问题

  • 一个序列SS任意删除若干个字符得到新序列T,则TT叫做S的子序列;
  • 两个序列XXY的公共子序列中,长度最长的那个,定义为XXY的最长公共子序列(LCS,Longest Common Subsequence):
    • 字符串1345513455245576245576的最长公共子序列为455455
    • 字符串acdfgacdfgadfcadfc的最长公共子序列为adfadf
  • 注意区别最长公共子串(Longest Common Substring)
    • 最长公共子串要求连续

分析

暴力求解法

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

LCS解法探索

LCS的记号
  • 字符串XX,长度为m,从1开始数;
  • 字符串YY,长度为n,从1开始数;
  • Xi=<x1,...,xi>Xi=<x1,...,xi>XX序列的前i个字符(1im1≤i≤m)(XiXi不妨读作字符串XXi前缀);
  • Yj=<y1,...,yi>Yj=<y1,...,yi>YY序列的前j个字符(1jn1≤j≤n)(字符串YYj前缀);
  • LCS(X,Y)LCS(X,Y)为字符串XXY的最长公共子序列,即为Z=<z1,...,zk>Z=<z1,...,zk>
    • 注意:事实上,XXY可能存在多个子串,长度相同并且最大,因此,LCS(X,Y)LCS(X,Y)严格的说,是个字符串集合。即ZLCS(X,Y)Z∈LCS(X,Y)
若 xm=yn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值