実行例
kitten => sitting : 3 Saturday => Sunday : 3 => foo : 3 にほんご => にっぽんご : 2
以下、C#とVBでの実装。 最適化はしていない。
using System;
class Sample {
private static int Min(int x, int y, int z)
{
return Math.Min(Math.Min(x, y), z);
}
private static int ComputeLevenshteinDistance(string strX, string strY)
{
if (strX == null)
throw new ArgumentNullException("strX");
if (strY == null)
throw new ArgumentNullException("strY");
if (strX.Length == 0)
return strY.Length;
if (strY.Length == 0)
return strX.Length;
var d = new int[strX.Length + 1, strY.Length + 1];
for (var i = 0; i <= strX.Length; i++) {
d[i, 0] = i;
}
for (var j = 0; j <= strY.Length; j++) {
d[0, j] = j;
}
for (var j = 1; j <= strY.Length; j++) {
for (var i = 1; i <= strX.Length; i++) {
if (strX[i - 1] == strY[j - 1])
d[i, j] = d[i - 1, j - 1];
else
d[i, j] = Min(d[i - 1, j] + 1,
d[i, j - 1] + 1,
d[i - 1, j - 1] + 1);
}
}
return d[strX.Length, strY.Length];
}
static void Main()
{
foreach (var texts in new[] {
new[] {"kitten", "sitting"},
new[] {"Saturday", "Sunday"},
new[] {"", "foo"},
new[] {"にほんご", "にっぽんご"},
}) {
Console.WriteLine("{0} => {1} : {2}",
texts[0],
texts[1],
ComputeLevenshteinDistance(texts[0], texts[1]));
}
}
}
Imports System
Class Sample
Private Shared Function Min(ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) As Integer
Return Math.Min(Math.Min(x, y), z)
End Function
Private Shared Function ComputeLevenshteinDistance(ByVal strX As String, ByVal strY As String) As Integer
If strX Is Nothing Then Throw New ArgumentNullException("strX")
If strY Is Nothing Then Throw New ArgumentNullException("strY")
If strX.Length = 0 Then Return strY.Length
If strY.Length = 0 Then Return strX.Length
Dim d(strX.Length + 1, strY.Length + 1) As Integer
For i As Integer = 0 To strX.Length
d(i, 0) = i
Next
For j As Integer = 0 To strY.Length
d(0, j) = j
Next
For j As Integer = 1 To strY.Length
For i As Integer = 1 To strX.Length
If strX(i - 1) = strY(j - 1) Then
d(i, j) = d(i - 1, j - 1)
Else
d(i, j) = Min(d(i - 1, j) + 1, d(i, j - 1) + 1, d(i - 1, j - 1) + 1)
End If
Next
Next
Return d(strX.Length, strY.Length)
End Function
Shared Sub Main()
For Each texts As String() In New String()() { _
New String() {"kitten", "sitting"}, _
New String() {"Saturday", "Sunday"}, _
New String() {"", "foo"}, _
New String() {"にほんご", "にっぽんご"} _
}
Console.WriteLine("{0} => {1} : {2}", _
texts(0), _
texts(1), _
ComputeLevenshteinDistance(texts(0), texts(1)))
Next
End Sub
End Class