Unique Word Abbreviation LC解題記錄

題目內容

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 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

這題也是鎖住的,經過率只有15%左右。這讓我不得其解,爲啥一道easy級別的題目會有如此低的Pass?是人性的扭曲仍是道德的淪喪,美國沒有《走近科學》,只能本身動手寫。app

解決思路

這題比較考察洋文水平,掃一眼要求很容易看出,應該把已有的dictionary的縮略詞都縮出來,存到一個地方,剛開始用了個Set。再調用isUnique的時候,用目標字符串壓縮後和Set裏面的元素作比較。有相同的就返回false,沒有就是true。
可是,
後來出了問題,由於目標詞可能和字典裏面的詞一致,好比字典裏只有有"hello",調用isUnique檢查hello的時候,應該返回true,由於沒有其餘詞和h3o同樣了。另外,字典裏面只有兩個hello的時候,也是返回true。因此這題的關鍵點在於『no other word』測試

code

public class ValidWordAbbr {
    Map<String,ArrayList<String>> map = new HashMap<>();
    public ValidWordAbbr(String[] dictionary) {
        //每一個詞都輪一遍
        for (String str : dictionary) {
            String abrv = abbrev(str);
            if (!map.containsKey(abrv)){
                ArrayList<String> list = new ArrayList<>();
                list.add(str);
                map.put(abrv,list);
            }
            else {
                ArrayList<String> list = map.get(abrv);
                //這裏的判斷是過濾相同的詞
                if (!list.contains(str)) list.add(str);
                map.put(abrv, list);
            }
        }
    }

    public boolean isUnique(String word) {
        String abrv = abbrev(word);
        if (map.containsKey(abrv)){
            //先看相同壓縮串是否是表明多個詞,一旦多了那確定不行
            if (map.get(abrv).size() > 1) return false;
            //若是隻有1個,那就對比一下這兩個詞是否是同樣的,同樣就行
            else if (map.get(abrv).get(0).equals(word)) return true;
            return false;
        }
        //其餘狀況確定是都行。
        return true;
    }
    //把字符串變成壓縮串
    public String abbrev(String word){
        if(word == null || word.length() < 3){
            return word;
        }
        //把頭,數字,尾巴連起來。
        StringBuilder sb = new StringBuilder();
        int len = word.length()-2;
        String slen = String.valueOf(len);
        sb.append(word.charAt(0));
        sb.append(slen);
        sb.append(word.charAt(word.length()-1));
        return sb.toString();
    }
    //作測試用
    public static void main(String[] args) {
        String[] test = {"hello", "a", "a"};
        ValidWordAbbr vwa = new ValidWordAbbr(test);
        System.out.print(vwa.isUnique("a"));
    }
}

複雜度分析

截至目前,我還不太清楚這種設計題會不會特別在乎複雜度,可能更注重corner case。這題遍歷一遍字典就能夠了,因此複雜度是O(n)。須要注意的是no other word這個說法,讓我多付出了兩次submit的代價,不過還比如15%高一些。ui

最後再說兩句

距離上一篇文章過了一段時間了,這段時間搬家再適應新環境,解決心理問題。從這一篇開始將會繼續保持更新進度。設計

相關文章
相關標籤/搜索