美文网首页
676. Implement Magic Dictionary

676. Implement Magic Dictionary

作者: DrunkPian0 | 来源:发表于2017-09-12 09:35 被阅读136次

    Implement a magic directory with buildDict, and search methods.
    For the method buildDict, you'll be given a list of non-repetitive words to build a dictionary.
    For the method search, you'll be given a word, and judge whether if you modify exactly one character into another character in this word, the modified word is in the dictionary you just built.
    Example 1:
    Input: buildDict(["hello", "leetcode"]), Output: Null
    Input: search("hello"), Output: False
    Input: search("hhllo"), Output: True
    Input: search("hell"), Output: False
    Input: search("leetcoded"), Output: False

    这题当时用List做的,就是遍历,复杂度O(m * n),m是单词长度,n是词典大小,也AC了但是LEETCODE提到了数据量大的情况。
    我看了一下别人用Map做的,复杂度O(m + n)。
    定义了一个Map<String , int []>
    用这样的技巧:
    String key = s.substring(0, i) + s.substring(i + 1);
    substring的第一个参数是inclusive的,第二个是exclusive的。

    对于hello这样的String,存放着诸如helo->{[2,'o'], [3,'o']}这样的键值对。

     List<int[]> val = map.getOrDefault(key, new ArrayList<int[]>());
     val.add(pair);
    

    上面这段的意思是把这个map的value弄成一个entry样式的,一个key对应一个包含好几个pari的list,每个pair保存着第几位去掉了哪个字母。真晦涩啊。

    class MagicDictionary {
    
        Map<String, List<int[]>> map = new HashMap<>();
        /** Initialize your data structure here. */
        public MagicDictionary() {
        }
        
        /** Build a dictionary through a list of words */
        public void buildDict(String[] dict) {
            for (String s : dict) {
                for (int i = 0; i < s.length(); i++) {
                    String key = s.substring(0, i) + s.substring(i + 1);
                    int[] pair = new int[] {i, s.charAt(i)};
                    
                    List<int[]> val = map.getOrDefault(key, new ArrayList<int[]>());
                    val.add(pair);
                    
                    map.put(key, val);
                }
            }
        }
        
        /** Returns if there is any word in the trie that equals to the given word after modifying exactly one character */
        public boolean search(String word) {
            for (int i = 0; i < word.length(); i++) {
                String key = word.substring(0, i) + word.substring(i + 1);
                if (map.containsKey(key)) {
                    for (int[] pair : map.get(key)) {
                        if (pair[0] == i && pair[1] != word.charAt(i)) return true;
                    }
                }
            }
            return false;
        }
    }
    

    相关文章

      网友评论

          本文标题:676. Implement Magic Dictionary

          本文链接:https://www.haomeiwen.com/subject/lvnqsxtx.html