本文的网课内容学习自B站左程云老师的算法详解课程,旨在对其中的知识进行整理和分享~
一.用类描述实现前缀树
题目:实现 Tire(前缀树)II
前缀树(trie ,发音为 "try")是一个树状的数据结构,用于高效地存储和检索一系列字符串的前缀。前缀树有许多应用,如自动补全和拼写检查。
实现前缀树 Trie 类:
Trie()初始化前缀树对象。void insert(String word)将字符串word插入前缀树中。int countWordsEqualTo(String word)返回前缀树中字符串word的实例个数。int countWordsStartingWith(String prefix)返回前缀树中以prefix为前缀的字符串个数。void erase(String word)从前缀树中移除字符串word。
示例 1:
输入
["Trie", "insert", "insert", "countWordsEqualTo", "countWordsStartingWith", "erase", "countWordsEqualTo", "countWordsStartingWith", "erase", "countWordsStartingWith"]
[[], ["apple"], ["apple"], ["apple"], ["app"], ["apple"], ["apple"], ["app"], ["apple"], ["app"]]
输出
[null, null, null, 2, 2, null, 1, 1, null, 0]
解释
Trie trie = new Trie();
trie.insert("apple"); // 插入 "apple"。
trie.insert("apple"); // 插入另一个 "apple"。
trie.countWordsEqualTo("apple"); // 有两个 "apple" 实例,所以返回 2。
trie.countWordsStartingWith("app"); // "app" 是 "apple" 的前缀,所以返回 2。
trie.erase("apple"); // 移除一个 "apple"。
trie.countWordsEqualTo("apple"); // 现在只有一个 "apple" 实例,所以返回 1。
trie.countWordsStartingWith("app"); // 返回 1
trie.erase("apple"); // 移除 "apple"。现在前缀树是空的。
trie.countWordsStartingWith("app"); // 返回 0
提示:
1 <= word.length, prefix.length <= 2000word和prefix只包含小写英文字母。insert、countWordsEqualTo、countWordsStartingWith和erase总共调用最多3 * 104次。- 保证每次调用
erase时,字符串word总是存在于前缀树中。
算法原理
-
整体原理
- 这个代码主要实现了前缀树(Trie树)的数据结构,并且提供了两种实现方式:一种是使用数组来表示节点的子节点(
Trie1类),另一种是使用哈希表来表示节点的子节点(Trie2类)。前缀树用于存储和查询字符串相关的信息,例如字符串的插入、删除、查询某个字符串出现的次数以及查询有多少字符串以某个前缀开头等操作。
- 这个代码主要实现了前缀树(Trie树)的数据结构,并且提供了两种实现方式:一种是使用数组来表示节点的子节点(
-
具体步骤(
Trie1类)- 第一步:节点结构定义(
TrieNode内部类)。- 定义了一个
TrieNode内部类,每个节点包含三个属性:pass表示通过该节点的单词数量(即经过该节点的字符串数量),end表示以该节点为结尾的单词数量,nexts是一个长度为26的TrieNode类型数组,用于存储下一个字符对应的子节点(假设只处理小写字母,每个位置对应一个字母,例如nexts[0]对应a的子节点)。
- 定义了一个
- 第二步:前缀树初始化(
Trie1构造函数)。- 创建一个根节点
root,并将其pass和end初始化为0,nexts数组初始化为null。
- 创建一个根节点
- 第三步:插入字符串(
insert方法)。- 从根节点开始,先将根节点的
pass加1,表示有一个新的字符串要插入。 - 然后遍历要插入的字符串
word中的每个字符。对于每个字符,通过path = word.charAt(i) - 'a'计算出在
- 从根节点开始,先将根节点的
- 第一步:节点结构定义(

最低0.47元/天 解锁文章
1675

被折叠的 条评论
为什么被折叠?



