211. 添加与搜索单词 - 数据结构设计
代码如下:
cpp
//前缀树 参考leetcode官方题解
class TrieNode {
public:
vector<TrieNode*> children;
bool isEnd;
TrieNode() : children(26), isEnd(false) {}
};
class WordDictionary {
private:
TrieNode* trie;
void insert(TrieNode* root, const string& word) {
TrieNode* node = root;
for (int i = 0; i < word.size(); i++) {
if (node->children[word[i] - 'a'] == nullptr)
node->children[word[i] - 'a'] = new TrieNode();
node = node->children[word[i] - 'a'];
}
node->isEnd = true;
}
//深度遍历
bool dfs(const string& word, int index, TrieNode* node) {
if (index ==
word.size()) //如果到了单词的末尾。看看前缀树是否到达单词末尾
return node->isEnd;
if (word[index] >= 'a' && word[index] <= 'z') { //如果是字母,就继续查找
TrieNode* child = node->children[word[index] - 'a'];
if (child != nullptr && dfs(word, index + 1, child))
return true;
} else if (word[index] ==
'.') { //如果是.,就把26个字母都查找一遍进行匹配
for (int i = 0; i < 26; i++) {
TrieNode* child = node->children[i];
if (child && dfs(word, index + 1, child))
return true;
}
}
return false;
}
public:
WordDictionary() { trie = new TrieNode(); }
void addWord(string word) { insert(trie, word); }
bool search(string word) { return dfs(word, 0, trie); }
};
/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary* obj = new WordDictionary();
* obj->addWord(word);
* bool param_2 = obj->search(word);
*/