问题描述
给定两个序列,求出它们的最长公共子序列。
如:序列X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a},则X和Y的最长公共子序列为{b,c,b,a}
- 子序列:子序列为原序列的一个子集,并不要求连续,但要求子序列中元素的顺序和原序列元素的顺序一致。
定理
设两个序列分别是X={x1,x2……,xm},Y={y1,y2……,yn},它们的最长公共子序列为Z={z1,z2,……,zk}。
- 若xm=yn,则先求Xm-1和Yn-1的最长公共子序列,再在其尾部加上xm即可得Xm和Yn的最长公共子序列。
- 若xm!=yn,则必须分别求Xm、Yn-1和Xm-1、Yn的最长公共子序列,其中较长者就是Xm和Yn的最长公共子序列。
数据结构
c[i][j]:
用来记录Xi和Yj的最长公共子序列的长度。s[i][j]:
用来标识Xi和Yi的最长公共子序列是由哪种情况得来:c[i][j-1]、c[i-1][j]、c[i][j]+1。
该数组能还原出最长公共子序列。