208. 实现 Trie (前缀树)
1. 题目
Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 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 * 10^4
次
2. 思路
- 已知题目要求实现一棵字典树,字典树的作用可以进行单词和前缀的检索,快速地找到一个单词或判断是否存在某个单词
- 根据题目提示,可以得知所有的单词仅由小写字母组成,构建
T
类,用于构建出树形结构,其中包含children
对象,由T
对象数组组成,大小为26,对应的是每一个小写字母的下标,同时包含一个isFinal
标识,用于标记当前节点是否为最后一个字符 insert
方法中,将对应单词转化为字符数组,按照字符序列深度进行节点的初始化,每一个节点对应只存储一个字符,当存储的是最后一个节点时,将isFinal
的值设置为true
search
方法中,与insert
方法相似,不同的是,在判断的过程中如果遇到对应字符节点为null
或对应最后一个单词节点的isFinal
为false
则表示无该单词,可直接返回false
startWith
判断方法中,如果对应的字符节点为null
,则直接返回false
- 以上计算过程中,
T
元素数组的下标计算主要是取的小写字母差值ch - 'a'
3. 代码
1 | class Trie { |
4. 复杂度
- 时间复杂度:初始化操作为
O(1)
,其他操作时间复杂度为O(|n|)
,其中|n|
则是每次插入或者查询的字符串长度 - 空间复杂度:
O(|T| * E)
,其中|T|
为所有插入的字符串的长度和,E
则为对应字符集的大小,当前字符集的大小为26