问题描述:
Implement a trie with insert
, search
, and startsWith
methods.
Example:
Trie trie = new Trie(); trie.insert("apple"); trie.search("apple"); // returns true trie.search("app"); // returns false trie.startsWith("app"); // returns true trie.insert("app"); trie.search("app"); // returns true
Note:
- You may assume that all inputs are consist of lowercase letters
a-z
. - All inputs are guaranteed to be non-empty strings.
解题思路:
参考了Grandyang的解法
trie树是前缀检索树,是牺牲空间换时间的一个代表。
为了实现trie树,我们要实现TrieNode节点类。
类中包含
TrieNode* child[26]; //用于存储后面的节点
bool isWord; //用于判断该点是否为单词结束的点。
注意在构造方法中:
TrieNode(): isWord(false){
for(auto &a: child)
a = NULL;
}
对此给出的解释是:“不加引用&,等于没有初始化,相当于新建个临时的a,给临时a初始化了不会改变原有的指针的。”
代码:
class TrieNode{ public: TrieNode* child[26]; bool isWord; TrieNode(): isWord(false){ for(auto &a: child) a = NULL; } }; 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(auto a: word){ int i = a - 'a'; if(!p->child[i]) p->child[i] = new TrieNode(); p = p->child[i]; } p->isWord = true; } /** Returns if the word is in the trie. */ bool search(string word) { TrieNode *p = root; for(auto a: word){ int i = a - 'a'; if(!p->child[i]) return false; p = p->child[i]; } return p->isWord; } /** Returns if there is any word in the trie that starts with the given prefix. */ bool startsWith(string prefix) { TrieNode *p = root; for(auto a:prefix){ int i = a - 'a'; if(!p->child[i]) return false; p = p->child[i]; } return true; } private: TrieNode *root; };