定义
字典树
字典树(Trie)是一种高效的树形数据结构,主要用于统计、排序和保存大量的字符串。
核心思想是利用字符串的公共前缀来减少查询时间。
字典树
Link to original
插入
一开始让为根节点。
对于字符串的每个字符,检查的是否为,若是则插入新节点表示。
在插入结束时将最后一个节点的标记为。
实现
struct Trie
{
Trie* next[26];
bool is_end;
Trie()
{
is_end = false;
for (int i = 0; i < 26; ++i)
next[i] = nullptr;
}
void insert(string& s)
{
Trie* node = this;
for (int i = 0; i < s.length(); ++i)
{
char c = s[i];
if (node->next[c - 'a'] == nullptr)
node->next[c - 'a'] = new Trie();
node = node->next[c - 'a'];
}
node->is_end = true;
}
bool search(string& s)
{
Trie* node = this;
for (int i = 0; i < s.length(); ++i)
{
char c = s[i];
if (node->next[c - 'a'] == nullptr)
return false;
node = node->next[c - 'a'];
}
return node->is_end; // 如果不是结尾说明只是存在s这个前缀而不是存在s这个字符串
}
bool is_prefix_exist(string& s)
{
Trie* node = this;
for (int i = 0; i < s.length(); ++i)
{
char c = s[i];
if (node->next[c - 'a'] == nullptr)
return false;
node = node->next[c - 'a'];
}
return true; // 某个字符串包括s这个前缀或者s本身就是字符串都表示包含s这个前缀
}
};