Java 中的 Levenshtein 算法

Levenshtein algorithm in Java

我正在尝试在 Java 中实现 Levenshtein 的算法,灵感来自于此 Wikipedia article

public static int indicator(char a, char b) {
    return (a == b) ? 0 : 1;
}

public static int levenshtein(String token1, String token2) {
    int[] levi = new int[token2.length() + 1];
    int[] levi_1 = new int[token2.length() + 1];

    // initialize column i=0
    for (int j = 0; j <= token2.length(); j++)
        levi_1[j] = j;

    // columns i=1 -> i=len(token1)
    for (int i = 1; i <= token1.length(); i++) {
        // lev_a,b(i,0) = i
        levi[0] = i;
        // update rest of column i
        for (int j = 1; j <= token2.length(); j++) {
            levi[j] = Math.min(Math.min(levi_1[j] + 1, levi[j - 1] + 1),
                               levi_1[j - 1] + indicator(token1.charAt(i - 1), token2.charAt(j - 1)));
        }

        // save column i to update column i+1
        levi_1 = levi;
    }

    return levi[token2.length()];
}

但是在字符串“Maus”和“Haus”上测试这个给出了 4 的错误答案。你能帮我解决我做错的地方吗?

问题来自这一行:

levi_1 = levi;

此行不会更改 levi_1 数组中的每个值,它只会更改其引用;当您调用 levi_1[0]levi_1[1]

时,值仍然相同

我建议您改写这些行:

for (int k = 0; k < levi.length; k++)
    levi_1[k] = levi[k];