43.【必备】前缀树原理和代码详解

本文的网课内容学习自B站左程云老师的算法详解课程,旨在对其中的知识进行整理和分享~

网课链接:算法讲解044【必备】前缀树原理和代码详解_哔哩哔哩_bilibili

一.用类描述实现前缀树

题目:实现 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 <= 2000
  • word 和 prefix 只包含小写英文字母。
  • insert、 countWordsEqualTo、 countWordsStartingWith 和 erase 总共调用最多 3 * 104 次。
  • 保证每次调用 erase 时,字符串 word 总是存在于前缀树中。

算法原理

  • 整体原理
    • 这个代码主要实现了前缀树(Trie树)的数据结构,并且提供了两种实现方式:一种是使用数组来表示节点的子节点(Trie1类),另一种是使用哈希表来表示节点的子节点(Trie2类)。前缀树用于存储和查询字符串相关的信息,例如字符串的插入、删除、查询某个字符串出现的次数以及查询有多少字符串以某个前缀开头等操作。
  • 具体步骤(Trie1类)
    • 第一步:节点结构定义(TrieNode内部类)。
      • 定义了一个TrieNode内部类,每个节点包含三个属性:pass表示通过该节点的单词数量(即经过该节点的字符串数量),end表示以该节点为结尾的单词数量,nexts是一个长度为26的TrieNode类型数组,用于存储下一个字符对应的子节点(假设只处理小写字母,每个位置对应一个字母,例如nexts[0]对应a的子节点)。
    • 第二步:前缀树初始化(Trie1构造函数)。
      • 创建一个根节点root,并将其passend初始化为0,nexts数组初始化为null
    • 第三步:插入字符串(insert方法)。
      • 从根节点开始,先将根节点的pass加1,表示有一个新的字符串要插入。
      • 然后遍历要插入的字符串word中的每个字符。对于每个字符,通过path = word.charAt(i) - 'a'计算出在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值