首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最长公共子序列printdDiff

最长公共子序列printdDiff
EN

Stack Overflow用户
提问于 2013-02-27 22:11:43
回答 2查看 408关注 0票数 2

只有一个关于最长公共子序列算法的快速问题。我已经完成了需要生成子序列的部分,如下所示:

代码语言:javascript
复制
public int[][] lcsLength(char[] input1, char[] input2) {
    int[][] opt = new int[M][N];
    for (int i = 1; i < input1.length; i++) {
        for (int j = 1; j < input2.length; j++) {
            if (input1[i] == input2[j]) {
                opt[i][j] = opt[i - 1][j - 1] + 1;
            } else {
                opt[i][j] = Math.max(opt[i][j - 1], opt[i - 1][j]);
            }
        }
    }
    return opt;
}

printDiff函数如下:

代码语言:javascript
复制
  private static void printDiff(int[][] opt,String x,String y,int i, int j) {

    if(i>0 &&j>0 && x.charAt(i-1)==y.charAt(j-1)){
    printDiff(i-1,j-1);
    System.out.println(x.charAt(i-1));
    }
    else{
        if(j>0&&(i==0||opt[i][j-1]>=opt[i-1][j])){
        printDiff(i-1,j-1);
         System.out.println("-"+y.charAt(j-1));
        }
        else if(i>0&&(j==0|| opt[i][j-1]<=opt[i-1][j])){
        printDiff(i-1,j-1);
         System.out.println(x.charAt(i-1));
        }
    }

}

然后如果我使用这个作为参数:

代码语言:javascript
复制
String input1="ABCDE"
String input2="ACDC"
int i=input1.length()
int j=input2.length()

在使用lcsLength()生成opt矩阵后,我希望printdiff会给出:

代码语言:javascript
复制
ABCDE-
A-CD-C

但我得到的却是:

代码语言:javascript
复制
ABCDE-
ABCD-C

任何关于我做错了什么的想法都会对我有很大的帮助

谢谢Laurent

EN

回答 2

Stack Overflow用户

发布于 2013-02-27 22:15:50

来自wiki

代码语言:javascript
复制
function printDiff(C[0..m,0..n], X[1..m], Y[1..n], i, j)
    if i > 0 and j > 0 and X[i] = Y[j]
        printDiff(C, X, Y, i-1, j-1)
        print "  " + X[i]
    else if j > 0 and (i = 0 or C[i,j-1] ≥ C[i-1,j])
        printDiff(C, X, Y, i, j-1)
        print "+ " + Y[j]
    else if i > 0 and (j = 0 or C[i,j-1] < C[i-1,j])
        printDiff(C, X, Y, i-1, j)
        print "- " + X[i]
    else
        print ""

这一行:

代码语言:javascript
复制
else if(i>0&&(j==0|| opt[i][j-1]<=opt[i-1][j])){

应该是:

代码语言:javascript
复制
else if(i>0&&(j==0|| opt[i][j-1]<opt[i-1][j])){

(仅将<=更改为<)

票数 0
EN

Stack Overflow用户

发布于 2013-02-27 22:52:29

不知道这是否是相关问题,但我认为您的LCS代码应该是:

代码语言:javascript
复制
public int[][] lcsLength(char[] input1, char[] input2) {
    int[][] opt = new int[input1.length+1][input2.length+1];
    for (int i = 1; i <= input1.length; i++) {
        for (int j = 1; j <= input2.length; j++) {
            if (input1[i-1] == input2[j-1]) {
                opt[i][j] = opt[i - 1][j - 1] + 1;
            } else {
                opt[i][j] = Math.max(opt[i][j - 1], opt[i - 1][j]);
            }
        }
    }
    return opt;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15114220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档