0
点赞
收藏
分享

微信扫一扫

最长公共子序列问题

星巢文化 2022-04-21 阅读 66

最长公共子序列问题


在这里插入图片描述

我和友友们一样喜欢编辑,天天敲代码🤭,沉迷学习,日渐消瘦。很荣幸能向大家分享我的所学,和大家一起进步,成为合格的卷王。如果文章有错误,欢迎在评论区指正。那么开始今天的学习吧!
那么今天的学习就到这里了。友友们觉得不错的可以给个关注,点赞或者收藏哦!感谢各位友友们的支持。以下的代码希望各位大佬们自行检验哦,毕竟亲手操作让记忆更加深刻。


今天的算法课主要讲的是最长公共子序列,写了俩题检验听课效果

题目描述
使用动态规划算法求解两个序列的最长公共子序列的长度。
输入
每组输入包括两行,每行包括一个字符串。
输出
两个序列的最长公共子序列的长度。
样例输入 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);
        }

    }
}




举报

相关推荐

0 条评论