最长公共子序列

匿名 (未验证) 提交于 2019-12-02 23:32:01
版权声明:本文为博主原创文章,未经博主允许不得转载。 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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!