【问题标题】:Common Subsequence in Different Length Arrays不同长度数组中的公共子序列
【发布时间】:2018-10-28 23:07:29
【问题描述】:

我已经实现了一个 DP 算法,可以在三个数组中找到最长的公共子序列。但问题是,当数组长度不同时,我的算法不起作用,我不知道为什么。据我所知,我的算法是正确的,所以我认为这与 Java 实现有关。这是我的 Java 代码:

static int[] lcsOf3(int[] X, int[] Y, int[] Z, int xLength, int yLength, int zLength) {
        int[][][] S = new int[xLength + 1][yLength + 1][zLength + 1];

        for (int i = 0; i <= xLength; i++) {
            for (int j = 0; j <= yLength; j++) {
                for (int k = 0; k <= zLength; k++) {
                    if (i == 0 || j == 0 || k == 0) {
                        S[i][j][k] = 0;
                    } else if (X[i - 1] == Y[j - 1] && X[i - 1] == Z[k - 1]) {
                        S[i][j][k]= S[i - 1][j - 1][k - 1] + 1;
                    } else {
                        S[i][j][k] = Math.max(Math.max(S[i - 1][j][k], S[i][j - 1][k]), S[i][j][k - 1]);
                    }
                }
            }
        }
        System.out.println(S[xLength][yLength][zLength]);
}

【问题讨论】:

  • 我宁愿在前两个数组之间找到 LCS,并使用该结果找到第三个数组的 LCS。你不需要处理 3d 数组。
  • 首先,看起来与 max() 的行应该检查所有 7 种可能性如何“接近”当前字符串 (i,j,k)。索引 x 和 x-1 的所有组合。

标签: java algorithm dynamic-programming subsequence longest-substring


【解决方案1】:

我再次查看了我的代码,结果发现这是我的实现问题,而不是算法本身。我的代码中获取输入数组(X,Y,Z)的部分存在错误。修复 bug 后,它在不同大小的列表上都能正常工作。

感谢所有试图提供帮助的人,很抱歉浪费了您的时间。

【讨论】:

    猜你喜欢
    • 2015-09-02
    • 2021-04-28
    • 2011-03-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多