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
两个方法。其中search返回true或false:当一个单词word能替换一个字母(替换的字母和原字母要不一样)后变成词典中的一个单词,返回true,否则返回false。这里的想法是用空间换时间。在建立词典的时候,对每个单词,每次将一个字母替换成‘_’然后保存,比如"hi",转为“h_”和“_i”保存到一个unordered_map结构中。在search时,对给定单词word,每次将一个字母替换成‘_’,然后在unordered_map结构中搜索,如果搜到,还要考虑是否是真正的替换一个字母(而不是原字母)得到的。下面是具体实现。
代码:
class MagicDictionary {
public:
/** Initialize your data structure here. */
MagicDictionary() {
}
/** Build a dictionary through a list of words */
void buildDict(vector<string> dict) {
for(auto word:dict) {
dict_init_.insert(word);
for(int i = 0; i < word.size(); ++i) {
int c = word[i];
word[i] = '_';
++dict_[word];
word[i] = c;
}
}
}
/** Returns if there is any word in the trie that equals to the given word after modifying exactly one character */
bool search(string word) {
string word1 = word;
for(int i = 0; i < word.size(); ++i) {
int c = word[i];
word[i] = '_';
auto it = dict_.find(word);
if(it != dict_.end()) {
if(dict_init_.find(word1) == dict_init_.end() || it->second > 1) {
return true;
}
}
word[i] = c;
}
return false;
}
private:
unordered_map<string, int> dict_;
unordered_set<string> dict_init_;
};