算法课代码保存:
java代码:
import java.util.Scanner;
public class max_list {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入两个字符串,每一个字符串都是以回车符号结束输入!");
String str1 = scan.next();
String str2 = scan.next();
System.out.println("结果分析如下:");
System.out.println("不带记录:最长公告子序列长度为:" + maxlength(str1, str2));
System.out.println("带记录:最长公告子序列长度为:" + Record_maxlength(str1, str2));
}
public static int maxlength(String str1, String str2) {
int[][] flag = new int[str1.length() + 1][str2.length() + 1];
// /初始化
for (int i = 0; i <= str1.length(); i++) {
for (int j = 0; j <= str2.length(); j++) {
flag[i][j] = 0;
}
}
// /开始查找
for (int i = 1; i <= str1.length(); i++) {
for (int j = 1; j <= str2.length(); j++) {
int temp = 0;
if (str1.charAt(i - 1) == str2.charAt(j - 1))
temp = 1;
flag[i][j] = max(temp + flag[i - 1][j - 1],max(flag[i][j - 1], flag[i - 1][j]));
}
}
return flag[str1.length()][str2.length()];
}
public static int Record_maxlength(String str1, String str2) {
int[][] flag = new int[str1.length() + 1][str2.length() + 1];
int[][] flag1 = new int[str1.length() + 1][str2.length() + 1];
// /初始化
for (int i = 0; i <= str1.length(); i++) {
for (int j = 0; j <= str2.length(); j++) {
flag[i][j] = 0;
flag1[i][j] = 0;
}
}
// /开始查找
for (int i = 1; i <= str1.length(); i++) {
for (int j = 1; j <= str2.length(); j++) {
if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
flag[i][j] = flag[i - 1][j - 1] + 1;
flag1[i][j] = 1;
} else {
if (flag[i][j - 1] > flag[i - 1][j]) {
flag[i][j] = flag[i][j - 1];
flag1[i][j] = 2;
} else {
flag[i][j] = flag[i - 1][j];
flag1[i][j] = 3;
}
}
}
}
System.out.println("最长公共子序列为:");
lcs(str1.length(), str2.length(), str1, flag1);
System.out.println();
return flag[str1.length()][str2.length()];
}
public static int max(int a, int b) {
return a > b ? a : b;
}
private static void lcs(int i, int j, String str1, int flag1[][]) {
if (i == 0 && j == 0)
return;
if (flag1[i][j] == 1){
lcs(i-1,j-1,str1,flag1);
System.out.print(str1.charAt(i-1) + " ");
}
else {
if (flag1[i][j] == 2)
lcs(i, j - 1, str1, flag1);
else
lcs(i - 1, j, str1, flag1);
}
}
}