2020-06-05
1.题目描述
实现 Trie (前缀树)
2.题解
由于题目中所有的输入都是由小写字母 a-z 构成的,我们可以将每个节点看作是有26个分支。
3.代码
class Trie {
public:
/** Initialize your data structure here. */
Trie():root(new TrieNode()) {
}
/** Inserts a word into the trie. */
void insert(string word) {
TrieNode* p=root;
for (char c:word){
if (!p->children[c-'a']){
p->children[c-'a']=new TrieNode();
}
p=p->children[c-'a'];
}
p->is_word=true;
}
/** Returns if the word is in the trie. */
bool search(string word) {
TrieNode* p=find(word);
return p&&p->is_word;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
return find(prefix)!=NULL;
}
~Trie(){
if (root) delete root;
}
private:
struct TrieNode{
TrieNode():is_word(false),children(26,NULL){}
~TrieNode(){
for (TrieNode* child:children){ // 对容器进行遍历
if (child) delete child;
}
}
bool is_word;
vector<TrieNode*> children;
};
TrieNode* find(string prefix){
TrieNode* p=root;
for (char c:prefix){
p=p->children[c-'a'];
if (p==NULL) break;
}
return p;
}
TrieNode* root;
};
/**
* Your Trie object will be instantiated and called as such:
* Trie* obj = new Trie();
* obj->insert(word);
* bool param_2 = obj->search(word);
* bool param_3 = obj->startsWith(prefix);
*/