package context.core.util;
/**
*
* @author Aale
*/
public class DistanceUtil {
/**
*
* @param args
*/
public static void main(String[] args) {
System.out.println(editDistance("Hello World", "Hello Mord"));
}
/**
*
* @param str1
* @param str2
* @return
*/
public static double editDistance(String str1, String str2) {
int m = str1.length();
int n = str2.length();
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
int mat[][] = new int[m + 1][n + 1];
if (m == 0 || n == 0) {
return Math.max(m, n);
} else {
for (int k = 0; k < m + 1; k++) {
mat[k][0] = k;
}
for (int k = 0; k < n + 1; k++) {
mat[0][k] = k;
}
for (int k = 1; k < m + 1; k++) {
for (int l = 1; l < n + 1; l++) {
int cost = 0;
if (str1.charAt(k - 1) == str2.charAt(l - 1)) {
cost = 0;
} else {
cost = 1;
}
mat[k][l] = minimum(mat[k - 1][l] + 1, mat[k][l - 1] + 1, mat[k - 1][l - 1] + cost);
if (k > 1 && l > 1 && str1.charAt(k - 1) == str2.charAt(l - 2) && str1.charAt(k - 2) == str2.charAt(l - 1)) {
mat[k][l] = Math.min(mat[k][l], mat[k - 2][l - 2] + cost);
}
}
}
return mat[m][n];
}
}
private static int minimum(int i, int j, int k) {
return Math.min(i, Math.min(j, k));
}
}