最长公共子序列问题
我和友友们一样喜欢编辑,天天敲代码🤭,沉迷学习,日渐消瘦。很荣幸能向大家分享我的所学,和大家一起进步,成为合格的卷王。如果文章有错误,欢迎在评论区指正。那么开始今天的学习吧!
那么今天的学习就到这里了。友友们觉得不错的可以给个关注,点赞或者收藏哦!感谢各位友友们的支持。以下的代码希望各位大佬们自行检验哦,毕竟亲手操作让记忆更加深刻。
今天的算法课主要讲的是最长公共子序列,写了俩题检验听课效果
题目描述
使用动态规划算法求解两个序列的最长公共子序列的长度。
输入
每组输入包括两行,每行包括一个字符串。
输出
两个序列的最长公共子序列的长度。
样例输入 Copy
ACBCDABD
ABDCABA
样例输出 Copy
5
package hc;
import java.util.Scanner;
public class Main830 {
static int a[][] = new int[100][100];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s1 = sc.nextLine();
String s2 = sc.nextLine();
char a[] = s1.toCharArray();
char[] arr = s2.toCharArray();
int sum = fun(s1,s2);
System.out.println(sum);
}
}
public static int fun(String s1, String s2) {
int length1 = s1.length();
int length2 = s2.length();
int[][] a = new int[length1 + 1][length2 + 1];//0行0列保留
for(int i = 1; i <= length1; i++){
for(int j = 1; j <= length2; j++){
if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
a[i][j] = a[i - 1][j - 1] + 1;
} else {
if (a[i][j - 1] > a[i-1][j]) {
a[i][j] = a[i][j - 1];
} else {
a[i][j] = a[i - 1][j];
}
}
}
}
return a[length1][length2];
}
}
题目描述
使用动态规划算法求两个序列的最长公共子序列,需构造一条最长公共子序列。
输入
每组输入包括两行,每行包括一个字符串。
输出
两个字符序列的一条最长公共子序列。(输入已确保最长公共子序列的唯一性)
样例输入 Copy
acdbxx
ccdxx
样例输出 Copy
cdxx
代码展示:
package hc;
import java.util.Scanner;
public class Main85 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s1 = sc.nextLine();
String s2 = sc.nextLine();
char[] a = s1.toCharArray();
char[] b = s2.toCharArray();
int n1 = s1.length();
int n2 = s2.length();
int dp[][] = new int[n1 + 1][n2 + 1];
int fun[][] = new int[n1 + 1][n2 + 1];
for (int i = 0; i <= n1; i++) {
fun[i][0] = 0;
}
for (int i = 0; i <= n2; i++) {
fun[0][i] = 0;
}
for (int i = 1; i <= n1; i++) {
for (int j = 1; j <= n2; j++) {
if (a[i - 1] == b[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
fun[i][j] = 1;
} else if (dp[i][j - 1] > dp[i - 1][j]) {
dp[i][j] = dp[i][j - 1];
fun[i][j] = 2;
} else {
dp[i][j] = dp[i - 1][j];
fun[i][j] = 3;
}
}
}
f(n1, n2, a, fun);
}
}
public static void f(int i, int j, char[] a, int fun[][]) {
if (i == 0 || j == 0) return;
if (fun[i][j] == 1) {
f(i - 1, j - 1, a, fun);
System.out.print(a[i - 1]);
} else if (fun[i][j] == 2) {
f(i, j - 1, a, fun);
} else {
f(i - 1, j, a, fun);
}
}
}