这里我想使用动态编程算法输出最长的常用字符串,下面的代码是我的实现。使我连接的是输出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);
}
}
}
答案 0 :(得分:0)
当遍历树(您的代码实际正在执行)时,您可以遍历三个命令之一:
参考Tree traversal on Wikipedia.
当您更改代码中2行的顺序时,您将在预订和按顺序遍历之间切换。看一下维基百科的文章,它应该可以帮助您理解不同遍历顺序之间的区别,以及如何为它们编写代码。