java - 编辑距离 Java

标签 java sorting methods

我编写了这个算法来计算删除和插入(编辑)数量的总和,以使第一个字符串等于第二个字符串。但它不起作用。

public static int distance (String s1, String s2) {
    return distance(s1, s2, 0, 0);
}

private static int distance(String s1, String s2, int i, int j) {
    if (i == s1.length) return j;
    if (j == s2.length) return i;
    if (s1.charAt(i) == s2.charAt(j))
        return distance(s1, s2, i + 1, j + 1);
    int rep = distance(s1, s2, i + 1, j + 1) + 1;
    int del = distance(s1, s2, i, j + 1) + 1;
    int ins = distance(s1, s2, i + 1, j) + 1;
    return Math.min(del, Math.min(ins, rep));
}

编辑:示例 字符串 1:“casa” 字符串 2:“卡拉” edit_distance=2(1 次删除 + 1 次插入)

编辑2: 这些是有效的字符串: 字符串 1:“casa”,字符串 2:“cassa”,edit_distance=1; 字符串 1:“pioppo”,字符串 2:“pioppo”,edit_distance=0;

这些是不起作用的: 字符串 1:“casa”,字符串 2:“cara”,edit_distance=2; (在我的代码中=0) 字符串 1:“tassa”,字符串 2:“passato”,edit_distance=4; (在我的代码中=2)

最佳答案

我认为实现几乎是正确的,并且您错过了停止条件。他们应该是:

if (j == s2.length()) {
    return s1.length() - i;
}
if (i == s1.length()) {
    return s2.length() - j;
}

所以完整的实现应该是:

private static int distance(String s1, String s2, int i, int j) {
    if (j == s2.length()) {
        return s1.length() - i;
    }
    if (i == s1.length()) {
        return s2.length() - j;
    }
    if (s1.charAt(i) == s2.charAt(j))
        return distance(s1, s2, i + 1, j + 1);
    int rep = distance(s1, s2, i + 1, j + 1) + 2; // since Jim Belushi considers replacement to be worth 2.
    int del = distance(s1, s2, i, j + 1) + 1;
    int ins = distance(s1, s2, i + 1, j) + 1;
    return Math.min(del, Math.min(ins, rep));
}

更新

这是“tassa”和“passato”的结果:

代码:

private static int distance(String s1, String s2, int i, int j) {
    if (j == s2.length()) {
        return s1.length() - i;
    }
    if (i == s1.length()) {
        return s2.length() - j;
    }
    if (s1.charAt(i) == s2.charAt(j))
        return distance(s1, s2, i + 1, j + 1);
    int rep = distance(s1, s2, i + 1, j + 1) + 2;
    int del = distance(s1, s2, i, j + 1) + 1;
    int ins = distance(s1, s2, i + 1, j) + 1;
    return Math.min(del, Math.min(ins, rep));
}

public static void main(String[] args) {
    int dist = distance("tassa", "passato", 0, 0);
    System.out.println(dist);
}

如果你运行这个你会得到:

4

关于java - 编辑距离 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49900588/

相关文章:

java - 有人可以向我简要解释一下 IntStream 发生了什么吗?

java - AtomicInteger.incrementAndGet() 与 AtomicInteger.getAndIncrement()

arrays - Elasticsearch 按数组列排序

Java 不知道从哪里开始使用这个方法来获取元素周期表

java - 尝试在 tomcat 6.0.14 服务器中发送邮件时抛出异常

java - 在java应用程序中与oracle的连接

arrays - 如何在 Swift 中对 NSDate 进行排序

sorting - 按不同字段对Lucene搜索结果进行排序

在方法上使用三元运算符的 Java 递归

Java静态线程安全