实现 Trie (前缀树)
问题:
Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 Trie 类:
Trie() 初始化前缀树对象。
void insert(String word)
向前缀树中插入字符串 word 。
boolean search(String word)
如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
boolean startsWith(String prefix)
如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
思路:
参照 官方题解
其实就是建立一棵树,让树根出发的每一分支构成一个前缀。
class Trie {
vector<Trie*> children; // 前缀数组,都是字母,所以给定 26 个大小空间
bool isEnd; // 存储每次查询是否搜索到了树的叶子节点。
Trie* searchPrefix(string prefix) {
Trie* node = this;
for(auto& ch : prefix) {
ch -= 'a';
if(!node->children[ch]) return 0; // 判断树中是否含有查询前缀字符
node = node->children[ch];
}
return node; // 都存在返回 true。
}
public:
/** Initialize your data structure here. */
Trie() : children(26), isEnd(0){ }
/** Inserts a word into the trie. */
void insert(string word) {
Trie* node = this;
for(auto& ch : word) {
ch -= 'a';
if(!node->children[ch]) node->children[ch] = new Trie();
node = node->children[ch];
}
node->isEnd = 1; // 给字符最后节点标记为 1
}
/** Returns if the word is in the trie. */
bool search(string word) {
Trie* node = this->searchPrefix(word);
return node && node->isEnd;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
return this->searchPrefix(prefix);
}
};
/**
* 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);
*/