[LeetCode] 676. Implement Magic Dictionary 实现神奇字典
Posted 轻风舞动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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:
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:
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:
# 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++:
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++:
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
All LeetCode Questions List 题目汇总
以上是关于[LeetCode] 676. Implement Magic Dictionary 实现神奇字典的主要内容,如果未能解决你的问题,请参考以下文章
676. Implement Magic Dictionary 实现魔术字典
LC 676. Implement Magic Dictionary
LeetCode 0676.实现一个魔法字典 - 易实现但效率不是那么高的方法