1. 问题
定义:设X和Z是两个序列,其中X=<x1,x2,……,xm> Z=<z1,z2,….,zm>
如果存在 X 的元素构成的按下标严格递增序列<Xi1,Xi2,….,Xik>,使Xij=Zj,j=1,2,….,k,那么Z是X的子序列,Z含有的元素个数,称为子序列的长度。
定义:设X和Y是两个序列,如果Z既是X的子序列,也是Y的子序列,则称Z是X和Y的公共子序列。
实例:
问题:最长公共子序列问题(Longest Common Subsequence,LCS),给定序列
X=<x1,x2,……,xm>
Y=<y1,y2,….,ym> 求X和Y的最长公共子序列
2. 解析
X=<x1,x2,……,xi>
Y=<y1,y2,….,yj>
Z=<z1,z2,….,zk>
如果Zk是Xi和Yj的最长公共子序列
(1) Xi=Yj,那么zk=xi=yj,Zk-1是Xi-1和Yj-1的最长公共子序列
(2) Xi!=Yi, Zk!=Xi , 那么Zk是Xi-1和Yj的最长公共子序列。
(3) Xi!=Yi, Zk!=Yj , 那么Zk是Xi和Yj-1的最长公共子序列。
3. 设计
4. 分析
算法复杂度为O(mn)
5. 源码
https://github.com/Lu-ziyan/-/blob/master/LCS.cpp