题目:
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。
示例:
Trie trie = new Trie();
trie.insert(“apple”);
trie.search(“apple”); // 返回 true
trie.search(“app”); // 返回 false trie.startsWith(“app”); // 返回 true
trie.insert(“app”); trie.search(“app”); // 返回 true
说明:
你可以假设所有的输入都是由小写字母 a-z 构成的。
保证所有输入均为非空字符串。
思路
每个TrieNode的子节点由26个字母 a-z 的子节点组成记录单词的一位字符,如果当前节点为单词最后一个字符,则当前节点的item值为当前单词,否则为空。
代码
class TrieNode {
public:
TrieNode* children[26];
string item = "";
};
class Trie {
private:
TrieNode* root;
public:
/** Initialize your data structure here. */
Trie() {
root = new TrieNode();
}
/** Inserts a word into the trie. */
void insert(string word) {
TrieNode* node = this->root;
for(int i = 0; i < word.length(); i++) {
if(node->children[word[i]-'a'] == NULL) {
node->children[word[i]-'a'] = new TrieNode();
}
node = node->children[word[i]-'a'];
}
node->item = word;
}
/** Returns if the word is in the trie. */
bool search(string word) {
TrieNode* node = this->root;
for(int i = 0; i < word.length(); i++) {
if(node->children[word[i]-'a'] == NULL) {
return false;
}
node = node->children[word[i]-'a'];
}
return node->item == word;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
TrieNode* node = this->root;
for(int i = 0; i < prefix.length(); i++) {
if(node->children[prefix[i]-'a'] == NULL) {
return false;
}
node = node->children[prefix[i]-'a'];
}
return true;
}
};
输出