为什么最长的常见字符串不能先递归并输出后者

时间:2016-10-30 14:28:58

标签: java dynamic-programming

这里我想使用动态编程算法输出最长的常用字符串,下面的代码是我的实现。使我连接的是输出zend_extension = D:\Serwer\xampp\php\ext\php_xdebug-2.4.1-7.0-vc14.dll,它显然是错误的,如果我改变了这两个线条并让它先打印并递归后者,结果是真的。我用纸画了这样的过程,真的不知道为什么第一个是错的。

A C A D C B

display(flags, c, x-1, y-1);
System.out.print(c[x] + "  ");

更新:查找结果时非递归

    public class LCSubstring{
    public static void main(String[] args){
        String[] x = {"", "A","B","A","D","F","E","C","A"};
        String[] y = {"", "B","A","C","A","D","F","C","B","A"};
        int[][] flags = getFlag(x, y);
        display(flags, x, x.length-1, y.length-1);
    }
    public static int[][] getFlag(String[] x, String[] y){
        int[][] c = new int[x.length][y.length];
        int[][] b = new int[x.length][y.length];
        for(int i = 1; i < x.length; i++){
            for(int j = 1; j < y.length; j++){
                if(x[i] == y[j]){

                    c[i][j] = c[i-1][j-1] + 1;
                    b[i][j] = 1;
                }else if(c[i][j-1] >= c[i-1][j]){

                    c[i][j] = c[i][j-1];
                    b[i][j] = 0;
                }else{

                    c[i][j] = c[i-1][j];
                    b[i][j] = -1;
                }
            }
        }
        return b;
    }
    public static void display(int[][] flags, String[] c, int x, int y){

        if (x == 0 || y == 0) {
            return;
        }
        if(flags[x][y] == 1){

            display(flags, c, x-1, y-1);
            System.out.print(c[x] + "  ");
        }else if(flags[x][y] == 0){
            display(flags, c, x, y-1);
        }else if(flags[x][y] == -1){
            display(flags, c, x-1, y);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

当遍历树(您的代码实际正在执行)时,您可以遍历三个命令之一

  • 预购
  • 有序
  • 后序

参考Tree traversal on Wikipedia.

当您更改代码中2行的顺序时,您将在预订按顺序遍历之间切换。看一下维基百科的文章,它应该可以帮助您理解不同遍历顺序之间的区别,以及如何为它们编写代码。