Unique Word Abbreviation

An abbreviation of a word follows the form<first letter><number><last letter>. Below are some examples of word abbreviations:

a) it                      --> it    (no abbreviation)

     1
b) d|o|g                   --> d1g

              1    1  1
     1---5----0----5--8
c) i|nternationalizatio|n  --> i18n

              1
     1---5----0
d) l|ocalizatio|n          --> l10n

Assume you have a dictionary and given a word, find whether its abbreviation is unique in the dictionary. A word's abbreviation is unique if no other word from the dictionary has the same abbreviation.

Example

Example1

Input:
[ "deer", "door", "cake", "card" ]
isUnique("dear")
isUnique("cart")
Output:
false
true
Explanation:
Dictionary's abbreviation is ["d2r", "d2r", "c2e", "c2d"].
"dear" 's abbreviation is "d2r" , in dictionary.
"cart" 's abbreviation is "c2t" , not in dictionary.

Example2

Input:
[ "deer", "door", "cake", "card" ]
isUnique("cane")
isUnique("make")
Output:
false
true
Explanation:
Dictionary's abbreviation is ["d2r", "d2r", "c2e", "c2d"].
"cane" 's abbreviation is "c2e" , in dictionary.
"make" 's abbreviation is "m2e" , not in dictionary.
public class ValidWordAbbr {
    Set<String> dict;
    Map<String, Integer> map;

    public ValidWordAbbr(String[] dictionary) {
        map = new HashMap<>();
        dict = new HashSet<>();
        for (String word : dictionary) {
            if (dict.contains(word))
                continue;
            dict.add(word);
            if (word.length() > 2) {
                String key = word.charAt(0) + Integer.toString(word.length() - 2) + word.charAt(word.length() - 1);
                map.put(key, map.getOrDefault(key, 0) + 1);
            } else {
                map.put(word, map.getOrDefault(word, 0) + 1);
            }
        }
    }

    public boolean isUnique(String word) {
        String key;
        if (word.length() > 2)
            key = word.charAt(0) + Integer.toString(word.length() - 2) + word.charAt(word.length() - 1);
        else
            key = word;
        if ((dict.contains(word) && map.get(key) == 1) || !map.containsKey(key))
            return true;
        return false;
    }
}

Last updated