题目:
Implement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
class TrieNode {
public:
// Initialize your data structure here.
TrieNode(char c = '\0') {
val = c;
isEnd = false;
for (int i = 0; i < 26; ++i){
son[i] = NULL;
}
}
~TrieNode(){
for (int i = 0; i < 26; ++i){
if (son[i] != NULL) delete son[i];
}
}
char val;
bool isEnd;
TrieNode *son[26];
};
class Trie {
public:
Trie() {
root = new TrieNode();//root不代表任何字符,剩下的每个TrieNode都代表一个字符,TrieNode的每个TrieNode指针指向下一个字符, 指针的位置代表下一个字符是什么
}
~Trie(){
delete root;
}
// Inserts a word into the trie.
void insert(string word) {
if (word.empty()) return;
int n = word.size();
TrieNode *p = root;
for (int i = 0; i < n; ++i){
char c = word[i];
if (p->son[c - 'a'] == NULL){
TrieNode *q = new TrieNode(c);
p->son[c - 'a'] = q;
}
p = p->son[c - 'a'];
}
p->isEnd = true;
}
// Returns if the word is in the trie.
bool search(string word) {
if (word.empty()) return false;
int n = word.size();
TrieNode *p = root;
for (int i = 0; i < n; ++i){
char c = word[i];
if (p->son[c - 'a'] == NULL) return false;
p = p->son[c - 'a'];
}
return p->isEnd;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
bool startsWith(string prefix) {//TODO
if (prefix.empty()) return false;
int n = prefix.size();
TrieNode *p = root;
for (int i = 0; i < n; ++i){
char c = prefix[i];
if (p->son[c - 'a'] == NULL) return false;
p = p->son[c - 'a'];
}
return true;
}
private:
TrieNode* root;
};