解题思路:tire树+dfs搜索
存储的单词都是小写字母,所以用tire树来存。
对于查询的单词来说:
如果遇到'.',则枚举所有的存在的下一个字母进行搜索。
否则是单词,搜索下一个字母节点即可。
插入每个字符串:时间复杂度O(N)
查询每个字符串:最坏遍历所有的节点,时间复杂度O(NM)
空间复杂度O(26N)
class WordDictionary {
public:
WordDictionary* next[26];
bool isEnd;
WordDictionary() {
isEnd = false;
memset(next, 0, sizeof(next));
}
void addWord(string word) {
WordDictionary* node = this;
for (char c : word){
int u = c - 'a';
if (node -> next[u] == NULL) node -> next[u] = new WordDictionary();
node = node -> next[u];
}
node -> isEnd = true;
}
bool dfs(string& word, int k, WordDictionary* node){
if (k == word.size()) return node -> isEnd; //字符串枚举到最后了
//字符不为.
if (word[k] != '.'){
int u = word[k] - 'a';
if (node -> next[u] != NULL) return dfs(word, k + 1, node -> next[u]);
return false;
}
//为.,需要枚举所有的存在的下一个字母进行搜索
for (int i = 0; i < 26; i ++){
if (node -> next[i] && dfs(word, k + 1, node -> next[i]))
return true;
}
return false;
}
bool search(string word) {
WordDictionary* root = this;
return dfs(word, 0, root);
}
};