[LeetCode] 676. Implement Magic Dictionary 实现神奇字典
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
Note:
- You may assume that all the inputs are consist of lowercase letters
a-z
. - For contest purpose, the test data is rather small by now. You could think about highly efficient algorithm after the contest.
- Please remember to RESET your class variables declared in class MagicDictionary, as static/class variables are persisted across multiple test cases. Please see here for more details.
实现一个神奇字典,包含buildDict和search函数。buildDict函数的功能是能把给的没有重复单词的列表建立一个字典,search函数的功能是存在和这个单词只有一个位置上的字符不同返回true,否则返回false。
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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 ; } } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class MagicDictionary( object ): def _candidates( self , word): for i in xrange ( len (word)): yield word[:i] + '*' + word[i + 1 :] def buildDict( self , words): self .words = set (words) self .near = collections.Counter(cand for word in words for cand in self ._candidates(word)) def search( self , word): return any ( self .near[cand] > 1 or self .near[cand] = = 1 and word not in self .words for cand in self ._candidates(word)) |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | # Time: O(n), n is the length of the word # Space: O(d) import collections class MagicDictionary( object ): def __init__( self ): """ Initialize your data structure here. """ _trie = lambda : collections.defaultdict(_trie) self .trie = _trie() def buildDict( self , dictionary): """ Build a dictionary through a list of words :type dictionary: List[str] :rtype: void """ for word in dictionary: reduce ( dict .__getitem__, word, self .trie).setdefault( "_end" ) def search( self , word): """ Returns if there is any word in the trie that equals to the given word after modifying exactly one character :type word: str :rtype: bool """ def find(word, curr, i, mistakeAllowed): if i = = len (word): return "_end" in curr and not mistakeAllowed if word[i] not in curr: return any (find(word, curr[c], i + 1 , False ) for c in curr if c ! = "_end" ) \ if mistakeAllowed else False if mistakeAllowed: return find(word, curr[word[i]], i + 1 , True ) or \ any (find(word, curr[c], i + 1 , False ) \ for c in curr if c not in ( "_end" , word[i])) return find(word, curr[word[i]], i + 1 , False ) return find(word, self .trie, 0 , True ) |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class MagicDictionary { public : /** Initialize your data structure here. */ MagicDictionary() {} /** Build a dictionary through a list of words */ void buildDict(vector<string> dict) { for (string word : dict) { m[word.size()].push_back(word); } } /** Returns if there is any word in the trie that equals to the given word after modifying exactly one character */ bool search(string word) { for (string str : m[word.size()]) { int cnt = 0, i = 0; for (; i < word.size(); ++i) { if (word[i] == str[i]) continue ; if (word[i] != str[i] && cnt == 1) break ; ++cnt; } if (i == word.size() && cnt == 1) return true ; } return false ; } private : unordered_map< int , vector<string>> m; }; |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class MagicDictionary { public : /** Initialize your data structure here. */ MagicDictionary() {} /** Build a dictionary through a list of words */ void buildDict(vector<string> dict) { for (string word : dict) s.insert(word); } /** Returns if there is any word in the trie that equals to the given word after modifying exactly one character */ bool search(string word) { for ( int i = 0; i < word.size(); ++i) { char t = word[i]; for ( char c = 'a' ; c <= 'z' ; ++c) { if (c == t) continue ; word[i] = c; if (s.count(word)) return true ; } word[i] = t; } return false ; } private : unordered_set<string> s; }; |
类似题目:
[LeetCode] 208. Implement Trie (Prefix Tree) 实现字典树(前缀树)
720. Longest Word in Dictionary
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构