最长公共子序列问题

我和友友们一样喜欢编辑,天天敲代码🤭,沉迷学习,日渐消瘦。很荣幸能向大家分享我的所学,和大家一起进步,成为合格的卷王。如果文章有错误,欢迎在评论区指正。那么开始今天的学习吧!
 那么今天的学习就到这里了。友友们觉得不错的可以给个关注,点赞或者收藏哦!感谢各位友友们的支持。以下的代码希望各位大佬们自行检验哦,毕竟亲手操作让记忆更加深刻。
今天的算法课主要讲的是最长公共子序列,写了俩题检验听课效果
题目描述
 使用动态规划算法求解两个序列的最长公共子序列的长度。
 输入
 每组输入包括两行,每行包括一个字符串。
 输出
 两个序列的最长公共子序列的长度。
 样例输入 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);
        }
    }
}










