🚀 力扣热题 208:实现 Trie (前缀树)(详细解析)
📌 题目描述
力扣 208. 实现 Trie (前缀树)
Trie(发音类似 "try")是一种树形数据结构,用于高效地存储和检索字符串集合中的键。实现一个 Trie 类,支持以下操作:
- insert(word) :将一个字符串
word
插入到 Trie 中。- search(word) :如果 Trie 中的字符串
word
存在,返回true
;否则返回false
。- startsWith(prefix) :返回
true
如果有任何字符串在 Trie 中以prefix
为前缀。
🎯 示例 1:
输入:
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
["", "apple", "apple", "app", "app", "app", "app"]
输出:[null, null, true, false, true, null, true]
💡 解题思路
✅ 前缀树(Trie)结构
Trie 树,也叫字典树或前缀树,是一种树形结构,用于高效地存储字符串。每个节点包含一个字符,它是由上一个节点的字符所决定的。Trie 的根节点是空的。树的深度代表了字符的长度。
- 插入操作(insert):从根节点开始,每次查找字符是否存在,若存在则继续往下查找,否则插入新节点。
- 查找操作(search) :从根节点开始,依次查找每个字符是否存在。如果查找到字符串末尾且没有分支,返回
true
;否则返回false
。 - 前缀查找(startsWith):与查找操作类似,检查是否有路径能够匹配给定的前缀,查找过程不需要到达单词的结尾。
✅ 实现步骤
-
定义 Trie 节点 :
每个节点包含两个部分:
- 一个字符数组
children
(用于存储字母节点的指向)。 - 一个布尔值
isWord
,用于标记是否是一个有效单词的结尾。
- 一个字符数组
-
插入操作:
- 遍历每个字符,如果对应的子节点不存在,则创建新节点并加入。
- 最后将对应节点的
isWord
设置为true
,表示当前字符构成的字符串是一个有效单词。
-
查找操作:
- 遍历字符串中的每个字符,如果没有找到对应节点,则返回
false
。 - 如果所有字符都查找成功且最后节点是一个有效单词,则返回
true
。
- 遍历字符串中的每个字符,如果没有找到对应节点,则返回
-
前缀查找操作:
- 遍历前缀字符串中的每个字符,只要字符能够顺利找到对应节点,返回
true
。
- 遍历前缀字符串中的每个字符,只要字符能够顺利找到对应节点,返回
💻 Go 实现代码
✅ 方法:Trie 树实现
go
type Trie struct {
children map[rune]*Trie
isWord bool
}
func Constructor() Trie {
return Trie{children: make(map[rune]*Trie)}
}
func (t *Trie) Insert(word string) {
node := t
for _, ch := range word {
if _, exists := node.children[ch]; !exists {
node.children[ch] = &Trie{children: make(map[rune]*Trie)}
}
node = node.children[ch]
}
node.isWord = true
}
func (t *Trie) Search(word string) bool {
node := t
for _, ch := range word {
if _, exists := node.children[ch]; !exists {
return false
}
node = node.children[ch]
}
return node.isWord
}
func (t *Trie) StartsWith(prefix string) bool {
node := t
for _, ch := range prefix {
if _, exists := node.children[ch]; !exists {
return false
}
node = node.children[ch]
}
return true
}
⏳ 复杂度分析
操作 | 时间复杂度 | 空间复杂度 |
---|---|---|
插入操作 | O ( m ) O(m) O(m) | O ( m ) O(m) O(m) |
查找操作 | O ( m ) O(m) O(m) | O ( m ) O(m) O(m) |
前缀查找 | O ( m ) O(m) O(m) | O ( m ) O(m) O(m) |
- 时间复杂度 :每次操作都涉及到遍历字符串的每个字符,其中
m
是字符串的长度。 - 空间复杂度 :存储每个字符的 Trie 节点,对于所有插入的字符串,空间复杂度为 O ( m ) O(m) O(m),其中
m
是字符的总数。
📌 衍生思考
- Trie 树的变种:可以扩展用于存储更多信息,例如单词的频率、自动补全等。
- 应用场景 :
- 词典查找:例如搜索引擎的自动补全功能。
- 字符串匹配:用于解决高效的字符串匹配问题。
- IP 地址前缀查找:用于路由表的前缀匹配。
🎯 总结
- ✅ 本题通过 Trie 树 实现了字符串的插入、查找和前缀匹配功能。
- ✅ Trie 树能够高效处理大量字符串的操作,尤其适合处理前缀匹配问题。
- ✅ 在实际应用中,Trie 树常用于 自动补全、词典查找、字符串匹配等场景。
💡 如果觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐、关注 💻,持续分享更多高质量算法题解析!🎯🚀📌