Trie 树,又叫前缀树,字典树, 是一种有序的树形数据结构,用于高效地存储和检索字符串数据集中的键。下图是维基百科上关于trie树的一个典型例子,我们可以很清晰地看到,这棵树存储了许多前缀相似的字符串,给定一个字符串,我们可以很容易知道这个字符串是否被存储,而不需要遍历比较。
这一数据结构有相当多的应用情景,例如:
- 自动补全:
- 搜索提示:输入网址,跳出可能的选择
- 输入提示:根据已经输入的字符预测可能的词组和句子
- 拼写检查:存储合法的单词列表,快速查找是否存在合法的单词
- 前缀匹配
- IP路由查找
题目
leetcode 208 实现Trie(前缀树)
请你实现 Trie 类:
Trie()
初始化前缀树对象。void insert(String word)
向前缀树中插入字符串word
。boolean search(String word)
如果字符串word
在前缀树中,返回true
(即,在检索之前已经插入);否则,返回false
。boolean startsWith(String prefix)
如果之前已经插入的字符串word
的前缀之一为prefix
,返回true
;否则,返回false
。
示例:
1 | 输入 |
提示:
1 <= word.length, prefix.length <= 2000
word
和prefix
仅由小写英文字母组成insert
、search
和startsWith
调用次数 总计 不超过3 * 104
次
分析
这道题有几个地方需要注意:
insert
时,需要标记单词是否截止,因为trie中的节点既有可能是前缀,也有可能是单词search
与startswith
的区别在于,startswith
只需要搜索下去,看看有没有对应的节点;而search
还需要判断这个节点是否有截止信号
实现
1 | class Trie(object): |