题目:
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.
思路:
在测试数据比较小的情况下,我们定义一个哈希表,用来存储所有字典中的单词。在search一个单词word的时候,我们搜索所有和它只有一个单词不一样的单词,如果找到了,就返回true,否则返回false。
但是当测试数据比较大的时候,哈希表就比较占空间了。所以我们可以构建一个字典树(Trie)。思路也还是一样的,就是搜索所有和它只有一个单词不一样的单词,如果找到了,就返回true,否则就返回false。
哈希表比较占用空间,但是搜索速度快;字典树特别节省空间,而且搜索速度也比较快,搜索一个单词的时间复杂度就是该单词的长度,一般而言可以认为是O(1)。
代码:
class MagicDictionary {
public:
/** Initialize your data structure here. */
MagicDictionary() {
hash.clear();
}
/** Build a dictionary through a list of words */
void buildDict(vector<string> dict) {
for (auto &s : dict) {
hash.insert(s);
}
}
/** 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.length(); ++i) {
char c = word[i];
for (int j = 0; j < 26; ++j) {
if ('a' + j != c) {
word[i] = 'a' + j;
if (hash.count(word) > 0) {
return true;
}
}
}
word[i] = c;
}
return false;
}
private:
unordered_set<string> hash;
};
/**
* Your MagicDictionary object will be instantiated and called as such:
* MagicDictionary obj = new MagicDictionary();
* obj.buildDict(dict);
* bool param_2 = obj.search(word);
*/