最长公共子序列问题描述.
给定两个序列【X=x1,x2,x3,…,xi】和【Y=y1,y2,y3,…,yj】,设计一个动态规划算法找出X和Y的一个最长的公共子序列。
问题分析.
最长公共子序列(Longest Common Sequence)中“子序列”就是 将给定序列中零个或多个元素去掉之后得到的结果,例如“abcdefg”的子序列 可以是“acfg”,这个概念和“子串”不同,子串必须是原字符串的连续字符组 成的序列。给定两个序列【X=x1,x2,x3,…,xi】、【Y=y1,y2,y3,…,yj】,设两序列 的最长公共子序列 【LCS=z1,z2,z3,…,zk】。 考察序列X和Y的最末尾字符,即xi和yj。
- ①若 xi=yj,则 zk = xi = yj,并且意味着 LCS−zk是 X−xi和Y−yj的最长公共子序列;
- ②若 xi ≠ yj,并且 zk ≠ xi,则意味着LCS是X−xi和Y的最长公共子序列;
- ③若 xi ≠ yj,并且 zk ≠ yj,则意味着LCS是X和Y−yj的最长公共子序列;
- ④将 max(②,③)作为最长公共子序列,继续求解。
举例说明,如X=1,3,4,5,6,7,7,8、Y=3,5,7,4,8,6,7,8,2
X[8]=Y[9], 所以LCS(8,9)=max(LCS(7,9),LCS(8,8))。
最长公共子序列的长度记为Len(i,j),对于Len(i,j)其动态规划递推式以及边界条件如下所示:
