Trie树与字符串前缀

一、Trie树概述

1.1 定义

Trie(前缀树/字典树)是一种树形数据结构,用于高效存储和检索字符串集合。

1.2 核心特性

  • 根节点表示空字符串
  • 每条边代表一个字符
  • 从根到节点的路径表示一个字符串前缀

二、节点结构

class TrieNode {
TrieNode[] children; // 26个小写字母
boolean isEndOfWord; // 是否为一个单词的结尾

TrieNode() {
children = new TrieNode[26];
isEndOfWord = false;
}
}

三、基本操作

3.1 插入

public void insert(String word) {
TrieNode node = root;
for (char c : word.toCharArray()) {
int idx = c - 'a';
if (node.children[idx] == null) {
node.children[idx] = new TrieNode();
}
node = node.children[idx];
}
node.isEndOfWord = true;
}

时间复杂度:( O(m) ),( m ) = 单词长度

3.2 查找

public boolean search(String word) {
TrieNode node = searchPrefix(word);
return node != null && node.isEndOfWord;
}

public boolean startsWith(String prefix) {
return searchPrefix(prefix) != null;
}

private TrieNode searchPrefix(String prefix) {
TrieNode node = root;
for (char c : prefix.toCharArray()) {
int idx = c - 'a';
if (node.children[idx] == null) return null;
node = node.children[idx];
}
return node;
}

四、应用场景

4.1 自动补全

根据输入前缀,遍历子树收集所有单词。

4.2 最长公共前缀

public String longestCommonPrefix(String[] strs) {
Trie trie = new Trie();
for (String s : strs) trie.insert(s);
return trie.findLongestPrefix();
}

4.3 单词搜索 II

在二维字符网格中查找所有单词,先用Trie存储单词列表,再DFS网格。

五、压缩Trie

5.1 radix tree / patricia trie

合并只有一个子节点的链,减少空间。

六、总结

操作 时间 空间
插入 ( O(m) ) ( O(m \cdot n) )
查找 ( O(m) ) -
前缀匹配 ( O(m) ) -

Trie树以空间换时间,特别适合前缀查询频繁的场景。理解其核心思想(边代表字符,路径代表字符串),可以灵活应用于各类字符串问题。


   转载规则


《Trie树与字符串前缀》 小乐 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录