Implement a trie with insert, search, and startsWith methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z.
我的解法如下:
const int MAX_NODE = 26;
struct TrieNode {
long count;
TrieNode* next[MAX_NODE];
TrieNode() : count(0) { memset(next, 0, sizeof(next)); }
};
TrieNode memory[100000];
int allocp = 0;
class Trie {
public:
/** Initialize your data structure here. */
Trie() : root(create())
{}
~Trie() {
destroy(root);
}
/** Inserts a word into the trie. */
void insert(string word) {
TrieNode* tmp = root;
for(int i=0; i<word.length(); ++i){
int index = word[i] - 'a';
if(tmp->next[index] == NULL)
tmp->next[index] = create();
tmp = tmp->next[index];
}
tmp->count++; //只有在成为一个单词后count++
}
/** Returns if the word is in the trie. */
bool search(string word) {
TrieNode* tmp = find(word);
return tmp != NULL && tmp->count != 0;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
return find(prefix) != NULL;
}
private:
TrieNode* create() {
return &memory[allocp++];
}
/* 不需要析构,因为采用了栈上空间memory
void destroy(TrieNode* t) {
for(int i=0; i<MAX_NODE; ++i){
if(t->next[i] != NULL)
destroy(t->next[i]);
}
delete t;
}
*/
TrieNode* find(string& key){
TrieNode* tmp = root;
for(int i=0; i<key.length() && tmp!=NULL; ++i)
tmp = tmp->next[key[i]-'a'];
return tmp;
}
private:
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);
*/
关于Trie可以参考:字典树(Trie树)基础模版。