前缀树解法:
struct TrieNode
{
bool isEnd;
TrieNode *next[26];
TrieNode()
{
isEnd = false;
memset(next, NULL, sizeof(next));
}
};
class WordDictionary {
private:
TrieNode *root;
bool searchUtil(string word, int start, TrieNode *root)
{
TrieNode *node = root;
for(int i = start; i < word.size(); i++)
{
char ch = word[i];
if(ch == '.')
{
for(int j = 0; j < 26; j++)
{//将第i个字符分别改成a~z去递归
string temp = word;
temp[i] = 'a' + j;
if(searchUtil(temp, i, node) == true)
{//匹配到一个符合的单词
return true;
}
}
//把.换成a~z都不行
return false;
}
else if(node->next[ch - 'a'] == NULL)
{
return false;
}
else
{
node = node->next[ch - 'a'];
}
}
return node->isEnd;
}
public:
/** Initialize your data structure here. */
WordDictionary() {
root = new TrieNode();
}
/** Adds a word into the data structure. */
void addWord(string word) {
TrieNode *node = root;
for(int i = 0; i < word.size(); i++)
{
char ch = word[i];
if(node->next[ch - 'a'] == NULL)
{
node->next[ch - 'a'] = new TrieNode();
}
node = node->next[ch - 'a'];
}
node->isEnd = 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) {
return searchUtil(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);
*/