递归最长公共子串(LCS)问题优化

时间:2018-11-28 20:37:00

标签: java recursion optimization lcs

我在Java中具有以下代码:

public static int Secret(String a, String b, int x, int y){
    if ((x == -1) || (y == -1)) {
        return 0;
    }

    if (a.charAt(x) == b.charAt(y)) {
        return Secret(a, b, x-1, y-1) + 1;
    } else {
        int left = Secret(a, b, x, y-1);
        int up = Secret(a, b, x-1, y);

        if (left > up) {
            return left ;
        } else {
            return up;
        }
    }

    return -1; 
}

此代码看起来像最长的公共子字符串问题,但有垃圾问题。我应该反对使用O(mn)(时空)。

我尝试遵循维基百科(https://en.wikipedia.org/wiki/Longest_common_substring_problem)上的算法,即O(mn)(时空)。

public static int iterativeLCS(String a, String b, int x, int y) {
        int[][] L = new int[x+1][y+1];
        int z = 0;

        for (int i = 0; i <= x; i++) {
            for (int j = 0; j <= y; j++) {
                if (a.charAt(i) == b.charAt(j)) {
                    if ((i == 0) || (j == 0)) {
                        L[i][j] = 1;
                    } else {
                        L[i][j] = L[i-1][j-1] + 1;
                    }

                    if (L[i][j] > z) {
                        z = L[i][j];
                    }
                } else {
                    L[i][j] = 0;
                }
            }
        }
    }

但是某些输入的结果不匹配。例如:

xalmandriatico
talcolaritriom
13
13

Expected output (using the recursive alg): 8
Actual output (using the iterative alg from wikipedia): 2

对我必须做什么有任何想法吗?

0 个答案:

没有答案