版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TONGZONGE/article/details/90245545
最长公共子序列问题:给定两个序列 X={x1,x2,x3......xm}和Y={y1,y1,y3.......yn},找出X和Y的公共子序列。
1、穷举法是最容易想到的算法。对于X的所有序列,检查它是否也是Y的子序列,从而确定它是否为X和Y的公共子序列。并且在检查中记录最长公共子序列。因此,共有2^m个子序列,从而穷举法需要时间指数。
事实上,最长公共子结构问题具有最优子结构的性质.
设序列X={x1,x2,x3......xm}和Y={y1,y1,y3.......yn}的最长公共子系列为Z={z1,z2,z3........zK},则:
(1) 若xm=yn,则Zk=Xm=Yn,且Zm-1是Xm-1和Yn-1的最长公共子序列;
(2)若xm!=yn,且Zk!=Xm,,则Z是Xm-1和Y的最长公共子序列;
(3)若xm!=yn,且Zk!=Yn,,则Z是X和Yn-1的最长公共子序列;
2、子问题的递归问题
3、计算最优值
public class 最长公共子序列序列 { public static int IcsLength(char[]x,char[]y,int[][]b) { int m = x.length-1; int n =y.length-1; int[][]c = new int[m+1][n+1]; for(int i=1;i<=m;i++) c[i][0]=0; for(int i=1;i<=n;i++) c[0][i]=0; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { if(x[i]==y[j]) { c[i][j] = c[i-1][j-1]+1; b[i][j]=1; } else if(c[i-1][j]>=c[i][j-1]) { c[i][j]=c[i-1][j]; b[i][j]=2; }else { c[i][j]=c[i][j-1]; b[i][j]=3; } } return c[m][n]; }
4、构造最长公共子序列
public static void Ics(int i, int j, char[] x, int[][] b) { if (i == 0 || j == 0) return; if (b[i][j] == 1) { Ics(i - 1, j - 1, x, b); System.out.println(x[i]); } else if (b[i][j] == 2) Ics(i - 1, j, x, b); else Ics(i, j - 1, x, b); }
转载请标明出处:最长公共子序列
文章来源: https://blog.csdn.net/TONGZONGE/article/details/90245545