Implement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
一开始用了unorered_map,有点慢,换了数组后快了点
class TrieNode {
public:
char val;
TrieNode *children[26];
bool tail;
// Initialize your data structure here.
TrieNode() {
val = '\0';
for(int i = 0; i < 26; ++i)
children[i] = nullptr;
tail = false;
}
TrieNode(char c): val(c){
for(int i = 0; i < 26; ++i)
children[i] = nullptr;
tail = false;
}
};
class Trie {
public:
Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
void insert(string word) {
TrieNode *p = root;
int l = word.length();
for(int i = 0; i < l; ++i){
int j = word[i] - 'a';
if(!p->children[j]){
p->children[j] = new TrieNode(word[i]);
}
p = p->children[j];
}
p->tail = true;
}
// Returns if the word is in the trie.
bool search(string word) {
TrieNode *p = root;
int l = word.length();
for(int i = 0; i < l; ++i){
int j = word[i] - 'a';
if(!p->children[j])
return false;
p = p->children[j];
}
return p->tail;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
bool startsWith(string prefix) {
TrieNode *p = root;
int l = prefix.length();
for(int i = 0; i < l; ++i){
int j = prefix[i] - 'a';
if(!p->children[j])
return false;
p = p->children[j];
}
return true;
}
private:
TrieNode* root;
};