我正在AlgoDaily上解决这个Levenshtein Edit Distance问题,我的解决方案与他们的解决方案完全不同。我之前从未听说过Levenshtein编辑距离,所以我的方法基于问题描述以及解决方法。
问题描述
编辑距离是一种量化两个字符串之间差异的方法。 使用最小转换次数计算得出 一个字符串到另一个。
转换包括插入,删除和替换。 这是手套到坐的编辑距离:
- mitten-> sitten(用“ s”代替“ m”)
- 坐姿->坐姿(用“ i”代替“ e”)
- sittin->坐着(末尾插入“ g”)。
编辑距离为
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;
}