最长公共子序列

最长公共子序列

1.问题 给定序列

X=<x1,x2,...,xm>

Y=<y1,y2,...,yn>

求 X 和 Y 的最长公共子序列Z

2.解析

最长公共子序列

3.设计

最长公共子序列

	public static void getLCS(String x, String y){
		
		char[] s1 = x.toCharArray();
		char[] s2 = y.toCharArray();
		int[][] array = new int[x.length()+1][y.length()+1];
				
		for(int j = 0; j < array[0].length; j++){
			array[0][j] = 0;
		}
		for(int i = 0; i < array.length; i++){
			array[i][0] = 0;
		}
		
		for(int m = 1; m < array.length; m++){
			for(int n = 1; n < array[m].length; n++){
				if(s1[m - 1] == s2[n - 1]){
					array[m][n] = array[m-1][n-1] + 1;
				}else{
					array[m][n] = max(array[m -1][n], array[m][n -1]);
				}
			}
		}

		Stack stack = new Stack();
		int i = x.length() - 1;
		int j = y.length() - 1;
		
		while((i >= 0) && (j >= 0)){
			if(s1[i] == s2[j]){
				stack.push(s1[i]);
				i--;
				j--;
			}else{
				if(array[i+1][j] > array[i][j+1]){
					j--;
				}else{
					i--;
				}
			}
		}
		
		while(!stack.isEmpty()){
			System.out.print(stack.pop());
		}			
	}
	
	public static int max(int a, int b){
		return (a > b)? a : b;
	}
}

4.分析

T=O(mn),分别为两个字符串的长度

5.源码

https://github.com/JessySnow/Algorithm/blob/master/src/T9/LCS.java

最长公共子序列

上一篇:vscode 自动格式化md文件,搞得很是郁闷,加入 [markdown] 自定义配置 "editor.formatOnSave": false 搞定了。


下一篇:svn