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.
基本字典树的题目
class TrieNode{
public:
char var;
bool isword;
TrieNode* children[26];
TrieNode()
{
var = 0;
isword = 0;
memset(children, 0, sizeof(TreeNode*)*26);
}
TrieNode(char c)
{
var = c;
isword = 0;
memset(children, 0, sizeof(TreeNode*)*26);
}
};
class MagicDictionary {
public:
/** Initialize your data structure here. */
MagicDictionary()
{
root = new TrieNode();
}
/** Build a dictionary through a list of words */
void buildDict(vector<string> dict)
{
for (auto word : dict)
{
TrieNode* p = root;
for (int i = 0; i < word.size(); i++)
{
if ( p->children[word[i]-'a'] == 0 )
{
TrieNode *pNode = new TrieNode(word[i]);
p->children[word[i]-'a'] = pNode;
}
p = p->children[word[i]-'a'];
}
p->isword = true;
}
}
/** 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++)
{
string tmp = word;
for (char a = 'a'; a <= 'z'; a++)
{
if (word[i] == a)
continue;
tmp[i] = a;
if (searchhelp(tmp))
return true;
}
}
return false;
}
private:
TrieNode* root;
bool searchhelp(string word)
{
TrieNode* p = root;
for (int i = 0; i < word.size(); i++)
{
if ( p->children[word[i]-'a'] == 0 )
return false;
p = p->children[word[i]-'a'];
if (i + 1 == word.size() && p->isword)
return true;
}
return false;
}
};
/**
* Your MagicDictionary object will be instantiated and called as such:
* MagicDictionary obj = new MagicDictionary();
* obj.buildDict(dict);
* bool param_2 = obj.search(word);
*/