最长公共子序列(LCS)问题

LCS问题描述

  • 定义:最长公共子序列(Longest Common Subsequence),即定义两个序列X和Y,求X和Y的最长公共子序列(子序列:一个序列S任意删除若干个字符得到新序列T,则T叫做S的子序列)
  • 例如:字符串13455与245576的最长公共子序列为455
  • LCS的意义:LCS可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。

LCS解法的探索

  • 暴力求解:穷举法
    分析:假设字符串X,Y的长度分别为m,n,那么字符串X,Y对应的子序列分别为2^m和2^n个。如果任意两个子序列一一比较,穷举搜索法需要指数时间O(2^(m+n)),显然不可取。

  • 动态规划算法求解

    • 动态规划算法:动态规划一般也只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。
    • 动态规划算法分以下四个步骤
      1.描述最优解的结构
      2.递归定义最优解的值
      3.按自底向上的方式计算最优解的值
      4.由计算出的结果构造一个最优解

    • 利用动态规划求解LCS

      • 不妨设字符串X,长度为m,从1开始数,字符串Y,长度为n,从1开始数
      • 不妨记 Xi=(x1,⋯,xi)(1≤i≤m),Yj=(y1,⋯,yj) (1≤j≤n)
      • 假设LCS(X , Y) 为字符串X和Y的最长公共子序列,即为Z=(z1,⋯,zk)

     (1)若Xm = Yn(最后一个字符相同),则Xm与Yn的最长公共子序列Zk的最后一个字符必定为Xm(Yn)
         Zk = Xm = Yn
         LCS(Xm,Yn) = LCS(X(m-1),Y(n-1)) + Xm
         即在Xm-1和Yn-1的最长公共子序列的基础上加上相等元素

结尾字符相等,则LCS(Xm,Yn) = LCS(X(m-1),Y(n-1)) + Xm
举例:Xm = Yn

String 1 2 3 4 5 6 7
X B D C A B A
Y A B C B D A B

对于字符串字符串X,Y
X3 = Y3 = ‘C’,LCS(BDC,ABC)=LCS(BD,AB)+‘C’
X5 = Y4 = ‘B’,LCS(BDCAB,ABCB)=LCS(BDCA,ABC)+’B’


(2)若Xm ≠ Yn,则(1)LCS(Xm,Yn) = LCS(X(m-1),Y(n)),(2)LCS(Xm,Yn) = LCS(X(m),Y(n-1))
    证明:令Zk = LCS(Xm,Yn);由于Xm ≠ Yn 则Zk ≠ Xm 与Zk ≠ Yn至少有一个必然成立,因为Zk ≠ Xm,则最长公共子序列Zk是Xm-1和Yn得到的,即Zk = LCS(X(m-1),Y(n))。同理可证若Zk ≠ Ym,Zk = LCS(X(m),Y(n-1))
    即, 若Xm ≠ Yn,则LCS(Xm,Yn) = max{LCS(X(m-1),Y(n)), LCS(X(m),Y(n-1))}

结尾字符不相等
举例:Xm ≠ Yn

String 1 2 3 4 5 6 7
X B D C A B A
Y A B C B D A B

对于字符串字符串X,Y
X2 ≠ Y2 ,LCS(BD,AB)=max{LCS(BD,A), LCS(B,AB)}
X4 = Y5 ,LCS(BDCA,ABCBD)=max{ LCS(BDCA,ABCB), LCS(BDC,ABCBD) }


LCS分析总结:

LCS(XmYn)={ LCS(X(m1),Y(
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值