# 0676. Implement Magic Dictionary ###### tags: `Leetcode` `Medium` `FaceBook` `Trie` Link: https://leetcode.com/problems/implement-magic-dictionary/ ## 思路 用Trie 对于每个位置的字符,都尝试修改一遍,然后用find函数找修改的字符后面的子字串是否包含在trie里面,如果包含则返回true 时间复杂度:假设字符串的平均长度是k,那么构建trie的时间复杂度是$O(nk)$ 搜寻trie最差的time complexity是$O(26k^2)$,因为最差就是只有最后一个字母不一样 ## Code ```java= class MagicDictionary { class TrieNode{ TrieNode[] children = new TrieNode[26]; boolean isWord; public TrieNode(){} } TrieNode root; public MagicDictionary() { root = new TrieNode(); } public void buildDict(String[] dictionary) { for(String s:dictionary){ TrieNode curr = root; for(int i = 0;i < s.length();i++){ if(curr.children[s.charAt(i)-'a'] == null){ curr.children[s.charAt(i)-'a'] = new TrieNode(); } curr = curr.children[s.charAt(i)-'a']; } curr.isWord = true; } } public boolean search(String searchWord) { char[] arr = searchWord.toCharArray(); TrieNode curr = root; for(int i = 0;i < searchWord.length();i++){ for(char c = 'a';c <= 'z';c++){ if(arr[i]==c || curr.children[c-'a']==null) continue; if(find(curr.children[c-'a'], searchWord, i+1)) return true; } if(curr.children[searchWord.charAt(i)-'a']==null) return false; curr = curr.children[searchWord.charAt(i)-'a']; } return false; } public boolean find(TrieNode temp, String s, int idx){ TrieNode curr = temp; for(int i = idx;i < s.length();i++){ if(curr.children[s.charAt(i)-'a']==null) return false; curr = curr.children[s.charAt(i)-'a']; } return curr.isWord; } } ``` ```python= class TrieNode: def __init__(self, char): self.char = char self.children = {} self.is_end = False class MagicDictionary: def __init__(self): self.trie = TrieNode('#') def addWord(self, word): root = self.trie for char in word: if char not in root.children: root.children[char] = TrieNode(char) root = root.children[char] root.is_end = True def buildDict(self, dictionary: List[str]) -> None: for word in dictionary: self.addWord(word) def dfs(self, modification, searchWord, node): if not searchWord: return not modification and node.is_end for child in node.children.keys(): if child == searchWord[0]: if self.dfs(modification, searchWord[1:], node.children[child]): return True elif modification > 0: if self.dfs(modification-1, searchWord[1:], node.children[child]): return True return False def search(self, searchWord: str) -> bool: return self.dfs(1, searchWord, self.trie) ```