aboutsummaryrefslogtreecommitdiffstats
path: root/java/src
diff options
context:
space:
mode:
authorsatok <satok@google.com>2011-04-20 00:58:08 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-04-20 00:58:08 -0700
commit0aae85fb671b300130b1c842d8a9a4ec4a49a3d8 (patch)
treeef8b939475bfe5a95cfe9bdd43d41f02c3156fa1 /java/src
parent708aa80492eede026f0b66a8715dbb9be872a969 (diff)
parente18ba4275f7fedfc2f1be13799a8c73d22b53e02 (diff)
downloadlatinime-0aae85fb671b300130b1c842d8a9a4ec4a49a3d8.tar.gz
latinime-0aae85fb671b300130b1c842d8a9a4ec4a49a3d8.tar.xz
latinime-0aae85fb671b300130b1c842d8a9a4ec4a49a3d8.zip
Merge "Tweak edit distance"
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/inputmethod/latin/Utils.java27
1 files changed, 22 insertions, 5 deletions
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
index 7b334ac0a..f01a81d6e 100644
--- a/java/src/com/android/inputmethod/latin/Utils.java
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -258,6 +258,8 @@ public class Utils {
}
}
+
+ /* Damerau-Levenshtein distance */
public static int editDistance(CharSequence s, CharSequence t) {
if (s == null || t == null) {
throw new IllegalArgumentException("editDistance: Arguments should not be null.");
@@ -273,12 +275,27 @@ public class Utils {
}
for (int i = 0; i < sl; ++i) {
for (int j = 0; j < tl; ++j) {
- if (Character.toLowerCase(s.charAt(i)) == Character.toLowerCase(t.charAt(j))) {
- dp[i + 1][j + 1] = dp[i][j];
- } else {
- dp[i + 1][j + 1] = 1 + Math.min(dp[i][j],
- Math.min(dp[i + 1][j], dp[i][j + 1]));
+ final char sc = Character.toLowerCase(s.charAt(i));
+ final char tc = Character.toLowerCase(t.charAt(j));
+ final int cost = sc == tc ? 0 : 1;
+ dp[i + 1][j + 1] = Math.min(
+ dp[i][j + 1] + 1, Math.min(dp[i + 1][j] + 1, dp[i][j] + cost));
+ // Overwrite for transposition cases
+ if (i > 0 && j > 0
+ && sc == Character.toLowerCase(t.charAt(j - 1))
+ && tc == Character.toLowerCase(s.charAt(i - 1))) {
+ dp[i + 1][j + 1] = Math.min(dp[i + 1][j + 1], dp[i - 1][j - 1] + cost);
+ }
+ }
+ }
+ if (LatinImeLogger.sDBG) {
+ Log.d(TAG, "editDistance:" + s + "," + t);
+ for (int i = 0; i < dp.length; ++i) {
+ StringBuffer sb = new StringBuffer();
+ for (int j = 0; j < dp[i].length; ++j) {
+ sb.append(dp[i][j]).append(',');
}
+ Log.d(TAG, i + ":" + sb.toString());
}
}
return dp[sl][tl];