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