package com.fishercoder.solutions;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**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:
 Given dictionary = [ "deer", "door", "cake", "card" ]

 isUnique("dear") ->
 false

 isUnique("cart") ->
 true

 isUnique("cane") ->
 false

 isUnique("make") ->
 true
 */
public class _288 {
    public static class Solution1 {

        public class ValidWordAbbr {
            private Map<String, String> dict;

            public ValidWordAbbr(String[] dictionary) {
                dict = new HashMap();
                for (String word : dictionary) {
                    String key = word.length() <= 2 ? word : (word.charAt(0) + String.valueOf(word.length() - 2) + word.charAt(word.length() - 1));
                    if (dict.containsKey(key) && !dict.get(key).equals(word)) {
                        dict.put(key, "");
                    } else {
                        dict.put(key, word);
                    }
                }
            }

            public boolean isUnique(String word) {
                String key = word.length() <= 2 ? word : (word.charAt(0) + String.valueOf(word.length() - 2) + word.charAt(word.length() - 1));
                if (!dict.containsKey(key)) {
                    return true;
                } else {
                    return dict.get(key) != "" && dict.get(key).equals(word);
                }
            }
        }
    }

    public static class Solution2 {
        public class ValidWordAbbr {

            private Map<String, Set<String>> dict;

            public ValidWordAbbr(String[] dictionary) {
                dict = new HashMap();
                for (String word : dictionary) {
                    String key = word.length() <= 2 ? word : (word.charAt(0) + String.valueOf(word.length() - 2) + word.charAt(word.length() - 1));
                    if (dict.containsKey(key)) {
                        Set<String> set = dict.get(key);
                        set.add(word);
                        dict.put(key, set);
                    } else {
                        Set<String> set = new HashSet();
                        set.add(word);
                        dict.put(key, set);
                    }
                }
            }

            public boolean isUnique(String word) {
                String key = word.length() <= 2 ? word : (word.charAt(0) + String.valueOf(word.length() - 2) + word.charAt(word.length() - 1));
                if (!dict.containsKey(key)) {
                    return true;
                } else {
                    Set<String> set = dict.get(key);
                    if (set.size() != 1) {
                        return false;
                    }
                    Iterator<String> it = set.iterator();
                    return it.next().equals(word);
                }
            }
        }
    }
}

@@ -157,744 +157,8 @@
 t;%0A%0A
-/**An abbreviation of a word follows the form %3Cfirst letter%3E%3Cnumber%3E%3Clast letter%3E. Below are some examples of word abbreviations:%0A%0A a) it                      --%3E it    (no abbreviation)%0A%0A 1%0A b) d%7Co%7Cg                   --%3E d1g%0A%0A 1    1  1%0A 1---5----0----5--8%0A c) i%7Cnternationalizatio%7Cn  --%3E i18n%0A%0A 1%0A 1---5----0%0A d) l%7Cocalizatio%7Cn          --%3E l10n%0A 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.%0A%0A Example:%0A Given dictionary = %5B %22deer%22, %22door%22, %22cake%22, %22card%22 %5D%0A%0A isUnique(%22dear%22) -%3E%0A false%0A%0A isUnique(%22cart%22) -%3E%0A true%0A%0A isUnique(%22cane%22) -%3E%0A false%0A%0A isUnique(%22make%22) -%3E%0A true%0A */%0A
 publ

refactor 288