目录
Trie树基本概念
Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。它的key都为字符串,能做到高效查询和插入,时间复杂度为O(k),k为字符串长度,缺点是如果大量字符串没有共同前缀时很耗内存。它的核心思想就是通过最大限度地减少无谓的字符串比较,使得查询高效率,即「用空间换时间」,再利用共同前缀来提高查询效率。
实际存储结构如图
力扣208:实现前缀树
实现代码
//Trie的节点:val child isEndOfChild
class TrieNode{
public:
char val;
bool isEndOfWord;
TrieNode*child[26];
TrieNode()
{
isEndOfWord = false;
for(int i = 0;i<26;i++)
child[i] = nullptr;
val = '/';
}
TrieNode(char c)
{
isEndOfWord = false;
for(int i = 0;i<26;i++)
child[i] = nullptr;
val = c;
}
};
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) {
if(word == "")return;
int len = word.size();
TrieNode*p = root;
for(int i = 0;i<len;++i)
{
if((p->child)[word[i]-'a'] == nullptr)
{
(p->child)[word[i]-'a'] = new TrieNode(word[i]);
p = (p->child)[word[i]-'a'];
}
else
p = (p->child)[word[i]-'a'];
}
p->isEndOfWord = true;
}
/** Returns if the word is in the trie. */
bool search(string word) {
if(word == ""||root == nullptr)
return false;
TrieNode*p = root;
for(int i = 0;i<word.size();++i)
{
if((p->child)[word[i]-'a']!=nullptr)
p = (p->child)[word[i]-'a'];
else
return false;
}
return p->isEndOfWord == true?true:false;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
if(prefix == ""||root == nullptr)
return false;
TrieNode*p = root;
for(int i = 0;i<prefix.size();++i)
{
if((p->child)[prefix[i]-'a'] != nullptr)
p = (p->child)[prefix[i] - 'a'];
else
return false;
}
return true;
}
};
测试结果: