问题
设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