最长公共子序列_学习记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37770023/article/details/82749040

最长公共子序列_学习记录

package p40;

import java.util.Random;

/**
 * 最长公共子序列
 * @author Guozhu Zhu
 * @date 2018/9/17
 * @version 1.0
 *
 */
public class Test05 {
	
	/* ========== Test ========== */
	public static void main(String[] args) {
		int substringLength1 = 10;
		int substringLength2 = 10;
		//1. 产生两个随机的子序列
		String x = GetRandomStrings(substringLength1);
		String y = GetRandomStrings(substringLength2);
		int[][] opt = new int[substringLength1+1][substringLength2+1];
		for (int i = substringLength1-1; i >= 0; i--) {
			for (int j = substringLength2-1; j >= 0; j--) {
				if (x.charAt(i) == y.charAt(j)) {
					opt[i][j] = opt[i+1][j+1] + 1;
				} else {
					opt[i][j] = Math.max(opt[i+1][j], opt[i][j+1]);
				}
			}
		}
		System.out.println(opt[0][0]);
		for (int i = 0; i  < opt.length; i++) {
			for (int j = 0; j < opt[0].length; j++) {
				System.out.print(opt[i][j]);
			}
			System.out.println("");
		}
		System.out.println("substring1: " + x);
		System.out.println("substring2: " + y);
		System.out.print("lcs:");
		int i = 0, j = 0;
		while (i < substringLength1 && j < substringLength2) {
			if (x.charAt(i) == y.charAt(j)) {
				System.out.print(x.charAt(i));
				i++;
				j++;
			} else if (opt[i+1][j] >= opt[i][j+1]) {
				i++;
			} else {
				j++;
			}
		}
	}
	
	public static String GetRandomStrings(int length) {
		StringBuffer buffer = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
		StringBuffer sb = new StringBuffer();
		Random r = new Random();
		int range = buffer.length();
		for (int i = 0; i < length; i++) {
			sb.append(buffer.charAt(r.nextInt(range)));
		}
		return sb.toString();
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_37770023/article/details/82749040