Check for missing characters in User/Contacts dictionary as well.

Also accomodate for missing characters when doing diffs between words.
diff --git a/src/com/android/inputmethod/latin/ExpandableDictionary.java b/src/com/android/inputmethod/latin/ExpandableDictionary.java
index 5235e87..3f20783 100644
--- a/src/com/android/inputmethod/latin/ExpandableDictionary.java
+++ b/src/com/android/inputmethod/latin/ExpandableDictionary.java
@@ -102,7 +102,10 @@
     public void getWords(final WordComposer codes, final WordCallback callback) {
         mInputLength = codes.size();
         mMaxDepth = mInputLength * 3;
-        getWordsRec(mRoots, codes, mWordBuilder, 0, false, 1.0f, 0, callback);
+        getWordsRec(mRoots, codes, mWordBuilder, 0, false, 1.0f, 0, -1, callback);
+        for (int i = 0; i < mInputLength; i++) {
+            getWordsRec(mRoots, codes, mWordBuilder, 0, false, 1.0f, 0, i, callback);
+        }
     }
 
     @Override
@@ -163,7 +166,7 @@
      * @param callback the callback class for adding a word
      */
     protected void getWordsRec(List<Node> roots, final WordComposer codes, final char[] word, 
-            final int depth, boolean completion, float snr, int inputIndex,
+            final int depth, boolean completion, float snr, int inputIndex, int skipPos,
             WordCallback callback) {
         final int count = roots.size();
         final int codeSize = mInputLength;
@@ -193,18 +196,20 @@
                     }
                 }
                 if (children != null) {
-                    getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, 
-                            callback);
+                    getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex,
+                            skipPos, callback);
                 }
-            } else if (c == QUOTE && currentChars[0] != QUOTE) {
+            } else if ((c == QUOTE && currentChars[0] != QUOTE) || depth == skipPos) {
                 // Skip the ' and continue deeper
-                word[depth] = QUOTE;
+                word[depth] = c;
                 if (children != null) {
                     getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, 
-                            callback);
+                            skipPos, callback);
                 }
             } else {
-                for (int j = 0; j < currentChars.length; j++) {
+                // Don't use alternatives if we're looking for missing characters
+                final int alternativesSize = skipPos >= 0? 1 : currentChars.length;
+                for (int j = 0; j < alternativesSize; j++) {
                     float addedAttenuation = (j > 0 ? 1f : 3f);
                     if (currentChars[j] == -1) {
                         break;
@@ -223,11 +228,13 @@
                             }
                             if (children != null) {
                                 getWordsRec(children, codes, word, depth + 1, 
-                                        true, snr * addedAttenuation, inputIndex + 1, callback);
+                                        true, snr * addedAttenuation, inputIndex + 1,
+                                        skipPos, callback);
                             }
                         } else if (children != null) {
                             getWordsRec(children, codes, word, depth + 1, 
-                                    false, snr * addedAttenuation, inputIndex + 1, callback);
+                                    false, snr * addedAttenuation, inputIndex + 1,
+                                    skipPos, callback);
                         }
                     }
                 }
diff --git a/src/com/android/inputmethod/latin/Suggest.java b/src/com/android/inputmethod/latin/Suggest.java
index 077d76a..bb6a153 100755
--- a/src/com/android/inputmethod/latin/Suggest.java
+++ b/src/com/android/inputmethod/latin/Suggest.java
@@ -113,24 +113,34 @@
             mStringPool.add(sb);
         }
     }
-    
+
     private boolean haveSufficientCommonality(String original, CharSequence suggestion) {
-        final int len = Math.min(original.length(), suggestion.length());
-        if (len <= 2) return true;
+        final int originalLength = original.length();
+        final int suggestionLength = suggestion.length();
+        final int minLength = Math.min(originalLength, suggestionLength);
+        if (minLength <= 2) return true;
         int matching = 0;
-        for (int i = 0; i < len; i++) {
-            if (ExpandableDictionary.toLowerCase(original.charAt(i)) 
-                    == ExpandableDictionary.toLowerCase(suggestion.charAt(i))) {
+        int lessMatching = 0; // Count matches if we skip one character
+        int i;
+        for (i = 0; i < minLength; i++) {
+            final char origChar = ExpandableDictionary.toLowerCase(original.charAt(i));
+            if (origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i))) {
                 matching++;
+                lessMatching++;
+            } else if (i + 1 < suggestionLength
+                    && origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i + 1))) {
+                lessMatching++;
             }
         }
-        if (len <= 4) {
+        matching = Math.max(matching, lessMatching);
+
+        if (minLength <= 4) {
             return matching >= 2;
         } else {
-            return matching > len / 2;
+            return matching > minLength / 2;
         }
     }
-    
+
     /**
      * Returns a list of words that match the list of character codes passed in.
      * This list will be overwritten the next time this function is called.