Tôi đã tự do dịch một đoạn mã C# mà tôi đã viết để tính khoảng cách Levenshtein vào mã Java. Nó chỉ sử dụng hai mảng kích thước đơn thay thế cho một mảng có răng cưa lớn:
public static int getDifference(String a, String b)
{
// Minimize the amount of storage needed:
if (a.length() > b.length())
{
// Swap:
String x = a;
a = b;
b = x;
}
// Store only two rows of the matrix, instead of a big one
int[] mat1 = new int[a.length() + 1];
int[] mat2 = new int[a.length() + 1];
int i;
int j;
for (i = 1; i <= a.length(); i++)
mat1[i] = i;
mat2[0] = 1;
for (j = 1; j <= b.length(); j++)
{
for (i = 1; i <= a.length(); i++)
{
int c = (a.charAt(i - 1) == b.charAt(j - 1) ? 0 : 1);
mat2[i] =
Math.min(mat1[i - 1] + c,
Math.min(mat1[i] + 1, mat2[i - 1] + 1));
}
// Swap:
int[] x = mat1;
mat1 = mat2;
mat2 = x;
mat2[0] = mat1[0] + 1;
}
// It's row #1 because we swap rows at the end of each outer loop,
// as we are to return the last number on the lowest row
return mat1[a.length()];
}
Nó không được kiểm tra nghiêm ngặt, nhưng có vẻ như không hoạt động. Nó được dựa trên một thực hiện Python tôi đã thực hiện cho một bài tập đại học. Hi vọng điêu nay co ich!
Nguồn
2009-05-25 21:50:00
Heh, tôi đã nhầm lẫn và chỉnh sửa tiêu đề để nhấn mạnh thay vì tập trung sai - câu hỏi có lẽ cuối cùng vẫn là một khoảng cách chuỗi một, như câu trả lời được chấp nhận cho thấy. – icedwater