Trie (发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。
请你实现 Trie 类:
Trie()
初始化前缀树对象。void insert(String word)
向前缀树中插入字符串word
。boolean search(String word)
如果字符串word
在前缀树中,返回true
(即,在检索之前已经插入);否则,返回false
。boolean startsWith(String prefix)
如果之前已经插入的字符串word
的前缀之一为prefix
,返回true
;否则,返回false
。
cpp
//抄的
class Trie {
private:
vector<Trie*> children;
bool isEnd;
Trie* searchPrefix(string prefix)
{
Trie* node = this;
for(char ch:prefix)
{
ch -= 'a';
if(node->children[ch]==nullptr)
{
return nullptr;
}
node = node->children[ch];
}
return node;
}
public:
Trie():children(26),isEnd(false){}
void insert(string word) {
Trie* node = this;
for(char ch : word)
{
ch-='a';
if(node->children[ch]==nullptr)
{
node->children[ch] = new Trie();
}
node = node->children[ch];
}
node->isEnd = true;
}
bool search(string word) {
Trie* node = this->searchPrefix(word);
return node!=nullptr&&node->isEnd;
}
bool startsWith(string prefix) {
return this->searchPrefix(prefix)!=nullptr;
}
};
这里相当于,实现了一个26叉数,数组索引方便一一调用,isEnd布尔值方便逻辑判断
searchPrefix函数作用是查找一个前缀对应的节点,逻辑就是类似于二叉树的查找,如果找不到返回nullptr,如果找到就返回对应节点
insert函数与searchPrefix类似,将查找转换为生成,如果有不操作,如果没有就new一个
search和startsWith函数就是searchPrefix函数的简单调用