X和Y,当另一序列Z既是X的子序列又是Y的子序列时,若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。
同理,若序列Z既是X的子序列同时也是Y的子序列,则称Z为X和Y的公共子序列。其中最长的子序列称为最长公共子序列。
在求最长公共子序列中,我们可以看出如下规律:
设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk} ,则
由上面三个条件可得如下公式:
C[][]用来记录最长公共子序列的长度,则:
c[i][j] = <1> 0; (当i、j = 0时);
<2> c[i-1][j-1] + 1; (当i、j > 0 且 Xi = Yj时)(即第i个X序列元素与第j个Y元素相等)
<3> max(c[i][j-1] , c[i-1][j]) (当i、j > 0 且 Xi != Yj时)(当Xi与Yj不等时,取两个式子的最大值,若两者相等则默认取第一个)
同理,若序列Z既是X的子序列同时也是Y的子序列,则称Z为X和Y的公共子序列。其中最长的子序列称为最长公共子序列。
在求最长公共子序列中,我们可以看出如下规律:
设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk} ,则
- 若xm=yn,则zk=xm=yn,且zk-1是xm-1和yn-1的最长公共子序列。
- 若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列。(即:Z是X序列中前m个元素所组成的序列与Y序列的最长公共子序列)
- 若xm≠yn且zk≠yn,则Z是X和yn-1的最长公共子序列。(即:Z是Y序列中前n个元素所组成的序列与X序列的最长公共子序列)
由上面三个条件可得如下公式:
C[][]用来记录最长公共子序列的长度,则:
c[i][j] = <1> 0; (当i、j = 0时);
<2> c[i-1][j-1] + 1; (当i、j > 0 且 Xi = Yj时)(即第i个X序列元素与第j个Y元素相等)
<3> max(c[i][j-1] , c[i-1][j]) (当i、j > 0 且 Xi != Yj时)(当Xi与Yj不等时,取两个式子的最大值,若两者相等则默认取第一个)