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

打印最长公共子序列

徐茂材
2023-03-14

longestCommonSubsequence正在返回LCS的长度。代码运行良好。但我试图打印子序列的值。例如,它应该打印“acef”。但我的代码只打印“ae”<如何修复?

这是完整的代码https://pastebin.com/Sq4QMtxF

//Code to print the LCS
        int x = a.length();
        int y = b.length();

        String s = "";

        while (x > 0 && y > 0) {
            if (a.charAt(x - 1) == b.charAt(y - 1)) {
                s = a.charAt(x - 1) + s;
                x--;
                y--;
            } else {
                if (memo[x - 1][y] > memo[x][y - 1])
                    x--;
                else
                    y--;
            }
        }
        System.out.println(s);

共有1个答案

关志勇
2023-03-14

获取LCS的代码使用自顶向下的方法,您的备忘录是从0,0构建的,因此您的答案是在备忘录[0][0]中。

为了从备忘录中获取LCS字符串,您需要从上到下遍历。还要使用StringBuilder而不是将其添加到String(每次添加到String时它都会创建一个新对象)。这样,更改将是:

int x = 0, y = 0;
StringBuilder sb = new StringBuilder();
while (x < a.length() && y < b.length()) {
    if (a.charAt(x) == b.charAt(y)) {
        sb.append(a.charAt(x));
        x++;
        y++;
    } else {
        if (memo[x + 1][y] > memo[x][y + 1])
            x++;
        else
            y++;
    } 
            
}
System.out.println(sb.toString());
 类似资料:
  • 几个小时以来,我一直在尝试实现最长的公共子序列。我已经检查了LCSLength函数是否返回正确的长度,但它没有正确打印序列。 我下面给出的伪代码:http://en.wikipedia.org/wiki/Longest_common_subsequence_problem 如果您能提供任何帮助,我们将不胜感激。 测试案例: 返回4但字符串序列不正确。 返回14 谢谢

  • 我试图在c中实现最长公共子序列算法,矩阵c[]]存储最长公共子序列的长度,行[][]存储c[]]矩阵中的父块行,列[][]存储父块列。 我对解决LCS的方法非常不便和低效表示歉意,但什么都没有打印出来。请帮忙。

  • Iam尝试使用以下代码打印所有可能的最长公共子序列 1-首先,我找到了LCS长度dp矩阵,并尝试使用递归生成所有可能的输出。 输入和输出 实际上,每次我将字符添加到输出列表时,我都需要弹出字符并将其插入为旧的附加新的。但是当我添加行时 然后它只显示了LCS的一种可能性,而不是全部。请帮助,我哪里出错了?

  • 我已经实现了最长公共子序列算法,并获得了最长的正确答案,但无法找出打印出组成最长公共子序列的方法。 也就是说,我成功地获得了最长公共子序列数组的长度,但我想打印出最长的子序列。 这个代码的操场在这里 http://play.golang.org/p/0sKb_OARnf 当我尝试在标签得到更新时打印出子序列时,结果是重复的。我想为str1和str2打印出类似“GTABTABTABTAB”的东西 提

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

  • 我想出了一个蛮力算法来寻找两个给定字符串之间最长的公共子序列。它看起来时间复杂度为O(n^3)。它通过了我所有的测试用例,但我仍然不确定它是否会通过所有的测试用例......请让我知道这是正确的蛮力算法? 如果上面的代码不对,我要蛮力算法返回最长的公共子序列字符串,,我怎么才能做到这一点???