Leetcode-208-实现Trie(前缀树)
# Leetcode 208. 实现 Trie (前缀树)
# 题目描述
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 * 104
次
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-trie-prefix-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
# 解题思路
有百度百科可知(连接已上方给出),字典树是一种树形结构,每个节点只储存一个字符,且为节点不存储字符,我认为它是一种可以按照路径存储字符串的数据结构。
现在我们需要将一些单词(只有小写英文字母)存储在字典树里面,我们就在字典树里面的每个节点中创建一个大小为 26 的对象数组 Trie* next[26]
( 该数组中的26个位置分别对应26个小写英文字母
),同时我们创建一个用来提取字符编号的基准 Base
( const char Base='a';
, 编号 = 字符 - Base
),将计算出的编号作为访问对象数组的索引。
当我们向字典树中添加一个单词是,只需要一个字符一层的遍历字典树的节点,如果未找到包含该字符的节点,则新建一个节点并将字符放入;若找到了存放该字符的节点,则指向该节点并继续向下一层字符遍历;直到遍历完该单词的最后一个字母时,将该节点的 isWord
值改为 true
,标示着这里是一个单词的结尾。
当我们在字典树中查找一个单词时,与添加步骤相同,也是一直向下遍历,区别是当遍历时未找到对应的字符时需要返回 false
来表示未找到需要查找的单词;并且在查找到最后一个字符后,返回该字符的 isWord
来表示是否查找成功。
当我们在字典树中进行前缀匹配操作时,步骤跟查找一个单词的步骤基本相同,区别就是在查找到最后一个字符后直接返回 true
即可(因为在前缀匹配的条件下,只要找到了最后一个字符,就证明肯定有以该字符串为前缀的单词,这个单词的最小值就是前缀本身)。
# 代码实现
1 | class Trie { |
# 题目总结
在本题中,我们需要实现字典树,字典树是一种特殊的树形结构,由于储存的字符只有小写英文字母,所以可以用对象数组 Trie* next[26]
来存储。同时因为一个节点只能存放一个字符,使得我肯可以一个字符一层的去查找,而 isWord
给予了判断该字符是否为一个单词结尾的依据;插入,查找,前缀匹配三个操作都是依托上面所实现的东西来进行的。三种操作的相同点就是都要进行多次按照字符的遍历,不同点在于对于未找到对应字符的处理以及相同情况下的返回值不同。