题意:设计一种数据结构,能插入单词,然后查询单词,查询支持模糊查询,.代表一个任何字母。
题解:用trie树存,查找的时候遇到.就递归的去查。
class TrieNode
{
public:
bool isword;
char var;
TrieNode* children[26];
TrieNode()
{
var = 0;
isword = false;
memset(children,0x0,sizeof(children));
}
TrieNode(char c)
{
var = c;
isword = false;
memset(children,0x0,sizeof(children));
}
};
class WordDictionary {
public:
WordDictionary()
{
root = new TrieNode();
}
// Adds a word into the data structure.
void addWord(string word) {
TrieNode* tmp = root;
int n = word.length();
for(int i = 0; i < n; i++)
{
char c = word[i];
if(tmp->children[c - 'a'] == 0)
{
TrieNode* x = new TrieNode(c);
tmp->children[c - 'a'] = x;
}
tmp = tmp->children[c - 'a'];
}
tmp->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(TrieNode* head,string word)
{
if(word.length() == 1)
{
if(word[0] == '.')
{
bool flag = false;
for(int i = 0; i < 26;i++)
if(head->children[i] != 0)
flag |= head->children[i]->isword;
return flag;
}
else
{
if(head->children[word[0] - 'a'] != 0 && head->children[word[0] - 'a']->isword)
return true;
else
return false;
}
}
if(word[0] == '.')
{
bool flag = false;
for(int i = 0; i < 26;i++)
if(head->children[i] != 0)
flag |= search(head->children[i],word.substr(1));
return flag;
}
else
{
if(head->children[word[0] - 'a'] == 0)
return false;
else
return search(head->children[word[0] - 'a'],word.substr(1));
}
}
bool search(string word) {
return search(root,word);
}
private:
TrieNode* root = new TrieNode();
};