Trie

进阶

Trie 用路径表示字符串,前缀天然共享。

Trie

输入一组共享前缀的单词,可以直观看到前缀是如何被复用的。

AlgoAnim · Trie

待机

速度
待机
// 源代码
1struct TrieNode {
2    int next[26];
3    bool end;
4    TrieNode() : end(false) {
5        memset(next, -1, sizeof(next));
6    }
7};
8
9vector<TrieNode> trie(1);
10
11void insertWord(const string& s) {
12    int node = 0;
13    for (char ch : s) {
14        int c = ch - 'a';
15        if (trie[node].next[c] == -1) {
16            trie[node].next[c] = trie.size();
17            trie.emplace_back();
18        }
19        node = trie[node].next[c];
20    }
21    trie[node].end = true;
22}

复杂度分析

时间 按串长 O(L)
空间 O(字符总数)
最优 O(1) 空串
最坏 O(L)

算法讲解

Trie 的每条从根到节点的路径都对应一个前缀,因此插入和查询都按字符逐层向下走。

它特别适合前缀匹配、词频统计、自动补全和敏感词过滤。

和哈希表相比,Trie 把"相同前缀"合并存储,所以在大量前缀重复时很有优势。

进一步叠加 fail 指针后,就能过渡到 AC 自动机。