版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}
}