Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最长公共子序列printdiff_Java_Algorithm_Lcs - Fatal编程技术网

Java 最长公共子序列printdiff

Java 最长公共子序列printdiff,java,algorithm,lcs,Java,Algorithm,Lcs,只是一个关于最长公共子序列算法的快速问题。 我已经完成了需要生成子序列的部分,如下所示: 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++) { i

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

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;
}
  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));
        }
    }

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

ABCDE-
A-CD-C
但我得到的却是:

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

谢谢 劳伦特来自:

函数printDiff(C[0..m,0..n],X[1..m],Y[1..n],i,j) 如果i>0且j>0且X[i]=Y[j] printDiff(C,X,Y,i-1,j-1) 打印“+X[i] 如果j>0且(i=0或C[i,j-1]≥ C[i-1,j]) printDiff(C,X,Y,i,j-1) 打印“+”+Y[j] 否则,如果i>0且(j=0或C[i,j-1] 这一行:

else if(i>0&&(j==0|| opt[i][j-1]<=opt[i-1][j])){

else如果(i>0&(j==0|opt[i][j-1]0&(j==0|opt[i][j-1])不知道这是否是一个相关问题,但我认为您的LCS代码应该是:

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;
}
public int[]lcsLength(char[]input1,char[]input2){
int[][]opt=newint[input1.length+1][input2.length+1];

对于(int i=1;我尝试通过使用调试器或老式打印调试逐步调试算法?
else if(i>0&&(j==0|| opt[i][j-1]<=opt[i-1][j])){
else if(i>0&&(j==0|| opt[i][j-1]<opt[i-1][j])){
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;
}