算法题解-实现前缀树

简介: 算法题解-实现前缀树

题目


请你实现 Trie 类:

Trie() 初始化前缀树对象。 void insert(String word) 向前缀树中插入字符串 word 。 boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。 boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。

输入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
输出
[null, null, true, false, true, null, true]


题解


第一种


我们在Trie类的构造函数中,先声明了一个空对象作为根节点的children属性,然后我们在Trie类的原型上创建insert方法和searchPrefix方法以及search方法还有startsWith方法,这些方法中每一个都代表这一个功能,insert方法用于向Trie树中插入一个字符串,它首先获取根节点的children属性,然后遍历字符串中的每个字符,对于每个字符,如果在当前节点的children属性中不存在该字符,则在children中添加一个新的键值对,键为该字符,值为一个新的空对象,然后我们将节点指向该字符对应的对象,以便继续处理下一个字符,最后我们将该节点的isEnd属性设置为true,表示该节点是一个单词的结尾,searchPrefix方法用于查找以指定前缀开始的字符串,它首先获取根节点的children属性,然后遍历前缀字符串中的每个字符,对于每个字符如果在当前节点的children属性中不存在该字符,我们则返回false,否则将节点指向该字符对应的对象,以便继续处理下一个字符,最后返回最终节点对象,search方法用于查找指定字符串是否在Trie树中,它首先调用searchPrefix方法获取以该字符串为前缀的节点对象,然后判断该节点是否存在且isEnd属性是否为true,如果是则说明该字符串存在于Trie树中,startsWith方法用于判断Trie树中是否存在以指定前缀开始的字符串,它调用searchPrefix方法获取以该前缀为前缀的节点对象,如果节点对象存在则说明存在以该前缀开始的字符串,然后我们直接返回该节点对象即可

 var Trie = function () {
   this.children = {}
 }
 Trie.prototype.insert = function (word) {
   let node = this.children
   for (const ch of word) {
     if (!node[ch]) {
       node[ch] = {}
     }
     node = node[ch]
   }
   node.isEnd = true
 }
 Trie.prototype.searchPrefix = function (prefix) {
   let node = this.children
   for (const ch of prefix) {
     if (!node[ch]) {
       return false
     }
     node = node[ch]
   }
   return node
 }
 Trie.prototype.search = function (word) {
   const node = this.searchPrefix(word)
   return node !== undefined && node.isEnd !== undefined
 }
 Trie.prototype.startsWith = function (prefix) {
   return this.searchPrefix(prefix)
 }
相关文章
|
6月前
|
存储 算法 vr&ar
☆打卡算法☆LeetCode 208. 实现 Trie (前缀树) 算法解析
☆打卡算法☆LeetCode 208. 实现 Trie (前缀树) 算法解析
|
存储 自然语言处理 算法
从小白开始刷算法 前缀树篇 leetcode.720
从小白开始刷算法 前缀树篇 leetcode.720
|
存储 算法
从小白开始刷算法 前缀树篇 leetcode.208
从小白开始刷算法 前缀树篇 leetcode.208
|
算法 Java
敏感词过滤算法-前缀树-java
敏感词过滤算法-前缀树-java
262 0
|
存储 算法 C++
【每日算法Day 84】面试必考题:Trie(字典树/前缀树)的实现
【每日算法Day 84】面试必考题:Trie(字典树/前缀树)的实现
|
16天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
2天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
2天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。
|
2天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。
|
2天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
13 3