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.
class MagicDictionary {
public:
/** Initialize your data structure here. */
MagicDictionary() {
m.clear();
}
/** 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;
};
public:
/** Initialize your data structure here. */
MagicDictionary() {
m.clear();
}
/** 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;
};