Design a data structure that supports the following two operations:
void addWord(word) bool search(word)
search(word) can search a literal word or a regular expression string containing only letters a-z
or .
. A .
means it can represent any one letter.
For example:
addWord("bad") addWord("dad") addWord("mad") search("pad") -> false search("bad") -> true search(".ad") -> true search("b..") -> true
Note:
You may assume that all words are consist of lowercase letters a-z
.
解题思路:
这道题的解法类似于Implement Trie (Prefix Tree),查找词时,单词中包含 .,所以需要使用dfs搜索。
代码:
class Word
{
public:
bool isword;
Word *child[26];
Word():isword(false)
{
for(int i = 0; i < 26; i ++)
{
child[i] = NULL;
}
}
};
class WordDictionary {
public:
/** Initialize your data structure here. */
WordDictionary() {
root = new Word();
}
/** Adds a word into the data structure. */
void addWord(string word) {
Word *p = root;
for(int i = 0; i < word.size(); i++)
{
int t = word[i] - 'a';
if(!p->child[t]) p->child[t] = new Word();
p = p->child[t];
}
p->isword = true;
}
/** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
bool dfs(Word *p, string word, int n)
{
if(n == word.size())
{
return p->isword;
}
if(word[n] != '.')
{
int t = word[n] - 'a';
if(!p->child[t]) return false;
p = p->child[t];
return dfs(p, word, n + 1);
}
else
{
for(int i = 0; i < 26; i++)
{
if(p->child[i] && dfs(p->child[i], word, n + 1))
return true;
}
return false;
}
}
bool search(string word) {
return dfs(root, word, 0);
}
private:
Word *root;
};