我的Levenshtein编辑距离解决方案不正确吗?

时间:2019-04-28 16:53:13

标签: c# algorithm levenshtein-distance edit-distance

我正在AlgoDaily上解决这个Levenshtein Edit Distance问题,我的解决方案与他们的解决方案完全不同。我之前从未听说过Levenshtein编辑距离,所以我的方法基于问题描述以及解决方法。

问题描述

  

编辑距离是一种量化两个字符串之间差异的方法。   使用最小转换次数计算得出   一个字符串到另一个。

     

转换包括插入,删除和替换。   这是手套到坐的编辑距离:

     
      
  1. mitten-> sitten(用“ s”代替“ m”)
  2.   
  3. 坐姿->坐姿(用“ i”代替“ e”)
  4.   
  5. sittin->坐着(末尾插入“ g”)。
  6.   
     

编辑距离为3

AlgoDaily使用Levenshtein概念(javascript)的方法

function getEditDistance(a, b) {
    if (a.length == 0) return b.length;
    if (b.length == 0) return a.length;

    var matrix = [];

    // increment along the first column of each row
    var i;
    for (i = 0; i <= b.length; i++) {
        matrix[i] = [ i ];
    }

    // increment each column in the first row
    var j;
    for (j = 0; j <= a.length; j++) {
        matrix[0][j] = j;
    }

    // Fill in the rest of the matrix
    for (i = 1; i <= b.length; i++) {
        for (j = 1; j <= a.length; j++) {
            if (b.charAt(i - 1) == a.charAt(j - 1)) {
                matrix[i][j] = matrix[i - 1][j - 1];
            } else {
                matrix[i][j] = Math.min(
                    matrix[i - 1][j - 1] + 1, // substitution
                    Math.min(
                        matrix[i][j - 1] + 1, // insertion
                        matrix[i - 1][j] + 1
                    )
                ); // deletion
            }
        }
    }

    return matrix[b.length][a.length];
}

我的方法(C#)

这将为上述测试输出正确的距离,即“手套”->“坐着”。我已经为其他几个人运行过它,并且继续正确输出。我是否想念某些东西(除了没有真正应用Levenshtein的概念)?

    public static int CalculateEditDistance(string source, string destination) {
        if (string.IsNullOrWhiteSpace(source)) {
            return destination?.Length ?? 0;
        }

        if (string.IsNullOrWhiteSpace(destination)) {
            return source?.Length ?? 0;
        }

        source = source.ToLowerInvariant();
        destination = destination.ToLowerInvariant();

        var matches = 0;
        var minLength = Math.Min(source.Length, destination.Length);
        var index = 0;
        while (index < minLength) {
            if (source[index] == destination[index]) {
                matches++;
            }

            index++;
        }

        var substitutions = minLength - matches;
        var additions = (destination.Length - source.Length) >= 0 ? destination.Length - source.Length : 0;
        var deletions = (source.Length - destination.Length) >= 0 ? source.Length - destination.Length : 0;

        return substitutions + additions + deletions;
    }

0 个答案:

没有答案