题目大意
设计一个支持以下两种操作的数据结构:
void addWord(word)
bool search(word)
search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。
示例:
addWord("bad")
addWord("dad")
addWord("mad")
search("pad") -> false
search("bad") -> true
search(".ad") -> true
search("b..") -> true
解题思路
思路同leetcode208.实现Trie树。
不同之处在于存在’.’,当前字符如果是’.’,则要遍历neibors中的所有节点。
struct TrieNode
{
int end;
vector<TrieNode*> neibors;
TrieNode(){
end = 0;
neibors = vector<TrieNode*>(26, nullptr);
}
};
class WordDictionary {
private:
TrieNode * root = new TrieNode();
bool findWord(string & word, TrieNode* root, int index){
if (!root)
return false;
else{
if (index == word.size())
return root->end;
if (word[index] == '.'){
for (auto iter : root->neibors){
if (findWord(word,iter, index + 1))
return true;
}
return false;
}
else{
return findWord(word, root->neibors[word[index] - 'a'], index + 1);
}
}
}
public:
/** Initialize your data structure here. */
WordDictionary() {
}
/** Adds a word into the data structure. */
void addWord(string word) {
if (word.empty())
return ;
TrieNode * tmp = root;
for (int i = 0; i < word.size(); ++i){
int index = word[i] - 'a';
if (tmp->neibors[index] == nullptr)
tmp->neibors[index] = new TrieNode();
tmp = tmp->neibors[index];
}
++tmp->end;
}
/** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
bool search(string word) {
if (word.empty())
return false;
TrieNode * tmp = root;
return findWord(word, tmp, 0);
}
};