算法 test9 LCS算法

问题

设X和Y是两个序列,如果存在 X 的元素构成的按下标严格递增序列 ,使Xij=Zj,j=1,2,3…,k,那么 Z 是 X 的子序列,Z 含有的元素个数,称为子序列的长度。如果Z既是X的子序列,也是Y的子序列,则称Z是X和Y的公共子序列。
实例:
X=<A,B,C,B,D,A,B>
Y=<B,D,C,A,B,A>
Z=<B,D,A,B>

解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设计

算法1:求出最长子串的长度
C[0,j]=C[I,0]=0,1≤i≤m,1≤j≤n
for i=1 to m
for j=1 to n

C[i,j]= C[i-1,j-1]+1 i,j>0,xi=yj,B[i,j]=←(删除两个)
max{C[i,j-1],C[i-1,j]} i,j>0,xi≠yj C[i,j-1],B[i,j]=↓(删除y);C[i-1,j],B[i,j]=↑(删除x)
算法2:f(B,i,j)输出最长子串
(1) if i=0 or j=0 then return;
(2) if B[i,j]=← //删除两个
then 输出X[i]
else if B[i,j]=↑ f(B,i-1,j) //删除x
else if f(B,i,j-1) //删除y

分析

时间复杂度为O(mn)

源码

https://github.com/yaoshuangice/yaoshuang

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值