题目描述
题目链接:211. 添加与搜索单词 - 数据结构设计(leetcode)
设计一个支持以下两种操作的数据结构:
void addWord(word)
bool search(word)
search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。
解题思路
主要是利用字典树。字典树的基本学习可以做这道题:208. 实现 Trie (前缀树)。理解了基本字典树的思想后再做这道题其实就是关于通配符的处理。基本思路就是:如果此时匹配的符号为’.’,那么就循环看每个字母并且递归遍历之后的。
代码
class WordDictionary {
WordDictionary* child[26];
bool isWord;
public:
/** Initialize your data structure here. */
WordDictionary() {
for(int i=0;i<26;i++){
child[i] = nullptr;
}
isWord = false;
}
/** Adds a word into the data structure. */
void addWord(string word) {
WordDictionary * t = this;
for(auto c:word){
if(!t->child[c-'a'])
t->child[c-'a'] = new WordDictionary();
t = t->child[c-'a'];
}
t->isWord = true;
}
/** 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.length()==0)return isWord;
WordDictionary * t = this;
for(int i=0;i<word.length();i++){
char c = word[i];
//通配符
if(c=='.'){
for(int j=0;j<26;j++){
if(t->child[j]){
if(t->child[j]->search(word.substr(i+1)))//递归遍历通配符之后的
return true;
}
}
return false;
}
else if(t->child[c-'a']){
t = t->child[c-'a'];
}
else return false;
}
return t->isWord;
}
};
/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary* obj = new WordDictionary();
* obj->addWord(word);
* bool param_2 = obj->search(word);
*/