compute Levenshtein Distance - Android java.lang

Android examples for java.lang:String Algorithm

Description

compute Levenshtein Distance

Demo Code

public class Main {
  private static int findCommonSuffixLength(CharSequence str1, CharSequence str2, int commonPrefixLength) {
    int length = (Math.min(str1.length(), str2.length()));
    for (int i = 0; i < length - commonPrefixLength; i++) {
      if (str1.charAt(str1.length() - i - 1) != str2.charAt(str2.length() - i - 1)) {
        return i;
      }//  w w w  .  j  ava 2s  . c o m
    }

    return 0;
  }

  private static int findCommonPrefixLength(CharSequence str1, CharSequence str2) {

    int length = (Math.min(str1.length(), str2.length()));
    for (int i = 0; i < length; i++) {
      if (str1.charAt(i) != str2.charAt(i)) {
        return i;
      }
    }

    return 0;

  }

  public static int computeLevenshteinDistance(CharSequence str1, CharSequence str2) {

    int commonPrefixLength = findCommonPrefixLength(str1, str2);

    if (commonPrefixLength == str1.length() && commonPrefixLength == str2.length()) {
      return 0; // same exact string
    }

    int commonSuffixLength = findCommonSuffixLength(str1, str2, commonPrefixLength);

    str1 = str1.subSequence(commonPrefixLength, str1.length() - commonSuffixLength);
    str2 = str2.subSequence(commonPrefixLength, str2.length() - commonSuffixLength);

    int[][] distance = new int[str1.length() + 1][str2.length() + 1];

    for (int i = 0; i <= str1.length(); i++) {
      distance[i][0] = i;
    }
    for (int j = 0; j <= str2.length(); j++) {
      distance[0][j] = j;
    }

    for (int i = 1; i <= str1.length(); i++) {
      for (int j = 1; j <= str2.length(); j++) {
        distance[i][j] = minimum(distance[i - 1][j] + 1, distance[i][j - 1] + 1,
            distance[i - 1][j - 1] + ((str1.charAt(i - 1) == str2.charAt(j - 1)) ? 0 : 1));
      }
    }

    int dist = distance[str1.length()][str2.length()];

    return dist;
  }

  private static int minimum(int a, int b, int c) {
    return Math.min(Math.min(a, b), c);
  }
}

Related Tutorials