请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
实现词典类 WordDictionary :
-
WordDictionary() 初始化词典对象
-
void addWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配
-
bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回 false 。word 中可能包含一些 '.' ,每个 . 都可以表示任何一个字母。
示例:
输入: ["WordDictionary","addWord","addWord","addWord","search","search","search","search"] [[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]] 输出: [null,null,null,null,false,true,true,true] 解释: WordDictionary wordDictionary = new WordDictionary(); wordDictionary.addWord("bad"); wordDictionary.addWord("dad"); wordDictionary.addWord("mad"); wordDictionary.search("pad"); // return False wordDictionary.search("bad"); // return True wordDictionary.search(".ad"); // return True wordDictionary.search("b.."); // return True
提示:
-
1 <= word.length <= 500
-
addWord 中的 word 由小写英文字母组成
-
search 中的 word 由 '.' 或小写英文字母组成
-
最多调用 50000 次 addWord 和 search
参考答案
struct Node
{
Node* children[26];
// 表示这里是一个单词的结束
bool isEnd;
Node()
{
memset(children, 0, sizeof(children));
isEnd = false;
}
};
class WordDictionary {
private:
Node* root;
public:
/** Initialize your data structure here. */
WordDictionary() {
root = new Node();
}
void addWord(string word) {
Node* curr = root;
for (char c : word)
{
int i = c - 'a';
if (curr->children[i] == nullptr)
{
curr->children[i] = new Node();
}
curr = curr->children[i];
}
// 最后一个字符则设置 isEnd
curr->isEnd = true;
}
bool dfs(string& word, int start, Node* curr)
{
// 已经遍历完,看是否是结束
if (start == word.size())
{
return curr->isEnd;
}
// 对于点,就是去找所有可能的下一个结点,然后递归
if (word[start] == '.')
{
for (int j = 0; j < 26; ++j)
{
if (curr->children[j] != nullptr && dfs(word, start+1, curr->children[j]))
{
return true;
}
}
return false;
}
else
{
// 其他情况就是找下一个结点
int i = word[start] - 'a';
if (curr->children[i] != nullptr)
{
return dfs(word, start+1, curr->children[i]);
}
else
{
return false;
}
}
}
bool search(string word) {
// 递归来查找
return dfs(word, 0, root);
}
};
/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary* obj = new WordDictionary();
* obj->addWord(word);
* bool param_2 = obj->search(word);
*/