当前位置: 首页 > 知识库问答 >
问题:

Java最长公共子序列的动态规划算法

孔厉刚
2023-03-14

我试图为最长公共子序列写一个动态规划算法。返回应该是这个子序列的长度。但是我的算法总是返回0。我找不到错误。

public static int LCS(String A, String B, int m, int n) {
    int table[][] = new int[m + 1][n + 1];

    for (int i = 0; i < m; i++) {
        table[i][0] = 0;
    }
    for (int i = 1; i < n; i++) {
        table[0][n] = 0;
    }
    for (int i = 1; i < m; i++) {
        for (int j = 1; j < n; j++) {
            if (A.charAt(i) == B.charAt(j)) {
                table[i][j] = table[i - 1][j - 1] + 1;
            } else {
                table[i][j] = max(table[i][j - 1], table[i - 1][j]);
            }
        }
    }

    return table[m][n];
}

private static int max(int a, int b) {
    return (a > b) ? a : b;
}

public static void main(String args[]) {
    Scanner in = new Scanner(System.in);

    System.out.println("Your input words:\n");
    String x = in.nextLine();
    String y = in.nextLine();

    in.close();

    int m = x.length();
    int n = y.length();

    System.out.println("Length of LCS is " + LCS(x, y, m, n));
}

共有2个答案

晏经武
2023-03-14

循环的条件使用

因此,i决不等于m,j决不等于n,所以在这些循环中决不修改表m,对吗?

返回的值是从未修改的table[m][n]处的值:0

祝高阳
2023-03-14

看起来您实现了此算法,但有几个错误:

>

  • 您的循环应该包含1... m1... n,这意味着您需要更改

    charAt()是基于零的,因此需要charAt(i-1)charAt(j-1)

    这些不是错误,而是:

    >

  • 在Java中,初始化为0的循环是不必要的<代码>表已经由新的运算符初始化为全零。

    无需实现max(),因为它已经实现为数学。max()

    因此,这是使用链接文章中的名称的结果:

    public static int LCS(String X, String Y) {
        final int m = X.length();
        final int n = Y.length();
        int[][] C = new int[m + 1][n + 1];
        for (int i = 1; i <= m; i++)
            for (int j = 1; j <= n; j++)
                if (X.charAt(i - 1) == Y.charAt(j - 1))
                    C[i][j] = C[i - 1][j - 1] + 1;
                else
                    C[i][j] = Math.max(C[i][j - 1], C[i - 1][j]);
        return C[m][n];
    }
    

    测试

    System.out.println(LCS("This is a test", "Does it work ok?"));
    

    输出

    5
    

    以下是最长公共子序列的匹配字母:

    This is a test
       ↑↑↑ ↑ ↑
       ↓↓↓ ↓    ↓
    Does it work ok?
    

  •  类似资料:
    • 我正在复习在寻找两个等长字符串的最长公共子序列的上下文中讨论动态规划的笔记。有问题的算法输出长度(而不是子字符串)。 所以我有两个字符串,说: S=ABAZDC,T=BACBAD 最长的公共子序列是ABAD(子字符串不必是相邻的字母) 算法如下,其中LCS[i,j]表示S[1..i]和T[1..j]的最长公共子序列: 我的笔记声称你可以填写一个表格,其中每个字符串都沿着一个轴写。比如: B A C

    • 我正在寻找最长的常见递增子序列问题的解决方案。如果你不熟悉,这里有一个链接。LCIS 这个问题基本上可以归结为两个不同的问题。“最长公共子序列”和“最长递增子序列”。这是最长公共子序列的递归解决方案: 基于此和这里找到的一般递归公式,我一直在尝试实现该算法,以便可以使用动态规划。 显然,这并没有给出正确的解决方案。任何帮助都将不胜感激。 例如,如果我给它两个序列{1,2,4,5}和{12, 1,

    • 我有以下问题: 示例: 输入:[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]输出:6顺序:[0,2,6,9,13,15]或[0,4,6,9,11,15]或[0,4,6,9,11,15] 这是一个DP问题,我确实有一些问题在记忆步骤。下面是我的代码: 多谢了。

    • 问题描述 什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。 举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。 分析与解法 解法一 最容易想到的算法是穷举搜索法,即对X的每一个子序列,检查它是否也是Y的子序列,从而确定它是

    • 本文向大家介绍Ruby实现的最长公共子序列算法,包括了Ruby实现的最长公共子序列算法的使用技巧和注意事项,需要的朋友参考一下 最长公共子序列,LCS,动态规划实现。

    • 然而,我意识到我真正想解决的问题有点不同。给定一个固定的k,我需要确保公共子序列只涉及长度正好为k的子串。例如,设置k=2,并让这两个字符串为 我需要的子序列是“。 是否可以修改动态规划解来解决这个问题?