Leetcode 208. 实现 Trie (前缀树)

心路历程:
一道题干进去了一个下午,单纯从解题角度可以直接用python的集合就很简单地解决(不知道是不是因为python底层的set()类)。后来从网上看到这道题应该从前缀树的角度去做,于是花了半个多小时基于字典做了前缀树的做法;后来想锻炼一下多叉树的做法,又花了一个多小时尝试。
前缀的含义是一个字符串的包含第一个元素作为开始的子序列,在代码自动补全里应用很多。
注意的点:
1、在利用字典建立多叉树的时候,一般是利用循环不变量的原则,每一层赋值root,然后判断当前层是否已经之前创建过。
2、利用class建立多叉树的时候,注意不要在初始化默认参数处设置children=[],否则所有示例化对象的children都指向同一个内存(花了很长时间找这个bug)。
3、注意在一个单词添加完之后,结尾要跟上一个结束判断符来区分到底是一个完整的单词还是一个其他长单词的一个部分。
4、写出来bug是很正常的事情,只要按照顺序检查输入输出关系即可debug。
解法一:python原生集合
class Trie:def __init__(self):self.set = set()self.prefixset = set()def insert(self, word: str) -> None:self.set.add(word)for j in range(1, len(word)+1): # 这块是取不到的,所以要加一,两个取不到的叠加self.prefixset.add(word[:j])def search(self, word: str) -> bool:if word in self.set:return Trueelse:return Falsedef startsWith(self, prefix: str) -> bool:# return True 直接return true可以过一半测试用例if prefix in self.prefixset:return Trueelse:return False
解法二:用字典实现多叉前缀树
class Trie:def __init__(self): # 用字典做一个前缀树self.dict = {}self.end = "!"def insert(self, word: str) -> None:root = self.dictfor i in range(len(word)):if word[i] not in root.keys():root[word[i]] = {} # 循环不变量root = root[word[i]]root[self.end] = Nonedef search(self, word: str) -> bool:# print(self.dict)root = self.dictfor c in word:if c in root.keys():root = root[c]else:return False# 还得保证单词结尾if self.end in root.keys():return Trueelse:return Falsedef startsWith(self, prefix: str) -> bool:root = self.dictfor c in prefix:if c in root.keys():root = root[c]else:return Falsereturn True
解法三:利用多叉树类实现前缀树(对比起来还是用字典实现多叉树方便一些)
class TreeNode:def __init__(self, val=None): # 不能在这里给children=[]赋值然后再self.children = children,否则所有实例都维护一个列表内存(浅拷贝问题)self.val =valself.children = [] # !!!def values(self):values = []for eve in self.children:values.append(eve.val)return valuesdef findvalindex(self, aval):for i in range(len(self.children)):if self.children[i].val == aval:return iassert Falseclass Trie:def __init__(self): # 用多叉树作前缀树self.root = TreeNode()def insert(self, word: str) -> None:root = self.rootfor i in range(len(word)):if word[i] not in root.values():node = TreeNode(word[i])root.children.append(node)root = node # 这句话无法赋值??有赋值作用,并且内存也确实变了,但是不知道为什么.values()方法都赋值到了根节点上去-》因为浅拷贝到了一个列表上# print(root, root.children[-1])else:vindex = root.findvalindex(word[i])root = root.children[vindex]leaf = TreeNode('!')root.children.append(leaf) # 加入结束符号def search(self, word: str) -> bool:root = self.rootfor c in word:if c in root.values():vindex = root.findvalindex(c)root = root.children[vindex]else:return False# print(root.values())# 此时root的children中应该包含leafif '!' in root.values():return Trueelse:return Falsedef startsWith(self, prefix: str) -> bool:root = self.rootfor c in prefix:if c in root.values():vindex = root.findvalindex(c)root = root.children[vindex]else:return Falsereturn True # 不需要是none
相关文章:
Leetcode 208. 实现 Trie (前缀树)
心路历程: 一道题干进去了一个下午,单纯从解题角度可以直接用python的集合就很简单地解决(不知道是不是因为python底层的set()类)。后来从网上看到这道题应该从前缀树的角度去做,于是花了半个多小时基于字典做了前缀树…...
蓝桥杯练习题——健身大调查
在浏览器中预览 index.html 页面效果如下: 目标 完成 js/index.js 中的 formSubmit 函数,用户填写表单信息后,点击蓝色提交按钮,表单项隐藏,页面显示用户提交的表单信息(在 id 为 result 的元素显示&#…...
React——组件通讯
组件通讯介绍 组件中的状态是私有的,组件的状态只能在组件内部使用,无法直接在组件外使用,但是我们在日常开发中,通常会把相似、功能完整的应用才分成组件(工厂模式)利于我们的开发,而不同组件直…...
php闭包应用
laravel 路由 bingTo 把路由URL映射到匿名回调函数上,框架会把匿名回调函数绑定到应用对象上,这样在匿名函数中就可以使用$this关键字引用重要的应用对象。Illuminate\Support\Traits\Macroable的__call方法。 自己写一个简单的demo: <?php <?…...
基于python+vue的OA公文发文管理系统flask-django-php-nodejs
系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对OA公文发文管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…...
脉冲变压器电感的工艺结构原理及选型参数总结
🏡《总目录》 目录 1,概述2,工作原理3,结构特点3.1,铁心结构3.2,铁心材料3.3,绕组4,工艺流程4.1,准备铁芯4.2,绕制线圈4.3,安装线圈4.4,固定线圈4.5,绝缘处理4.6,高压脉冲引出...
java中Arrays介绍及常用方法
在Java中,java.util.Arrays类是一个提供了各种操作数组的工具类。该类提供了一系列静态方法来对数组进行排序、搜索、填充、复制等操作。下面是对Arrays类的介绍以及常用方法的说明: toString()方法:将数组转换为字符串形式并返回,方便输出数…...
CTF题型 Http请求走私总结Burp靶场例题
CTF题型 Http请求走私总结&靶场例题 文章目录 CTF题型 Http请求走私总结&靶场例题HTTP请求走私HTTP请求走私漏洞原理分析为什么用前端服务器漏洞原理界定标准界定长度 重要!!!实验环境前提POST数据包结构必要结构快速判断Http请求走私类型时间延迟CL-TETE-CL 练习例题C…...
Nginx 的安装、启动和关闭
文章目录 一、背景说明二、Nginx 的安装2.1、依赖的安装2.2、Nginx 安装2.3、验证安装 三、启动 Nginx3.1、普通启动3.2、如何判断nginx已启动3.3、通过配置启动3.4、设置开机启动 四、关闭 Nginx4.1、优雅地关闭4.2、快速关闭4.3、只关闭主进程4.4、使用nginx关闭服务 五、重启…...
python 操作excel(openpyxl.load_workbook)、excel操作封装
操作excel 其他的库: xlrd xlwt : 过时了,只能操作xls后缀的文件。pandas:大数据测试 数据分析项目会用。 openpyxl:第三方库 支持的格式有:.xlsx、.xlsm、.xltx、.xltm,l不支持.xls文件格式…...
MySQL系统参数配置实战:生产环境优化
引言: MySQL作为广泛应用的关系型数据库,其系统参数配置直接影响着数据库的性能、稳定性以及资源利用率。本文旨在深入探讨MySQL的核心系统参数,并提供一份面向生产环境的配置建议,以帮助运维人员更好地优化数据库性能࿰…...
判断列表中每一个元素的个数
1.使用循环 nums [1, 1, 1, 2, 2, 3]# 构建一个空字典来存储元素和它们出现的次数 count_dict {}# 遍历列表,更新字典中每个元素出现的次数 for num in nums:if num in count_dict:count_dict[num] 1else:count_dict[num] 1# 输出统计结果 for num, count in c…...
目标检测——PP-YOLOE算法解读
PP-YOLO系列,均是基于百度自研PaddlePaddle深度学习框架发布的算法,2020年基于YOLOv3改进发布PP-YOLO,2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet,2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列,所以放一起解…...
每日一题 --- 螺旋矩阵 II[力扣][Go]
螺旋矩阵 II 题目:59. 螺旋矩阵 II - 力扣(LeetCode) 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出…...
C语言自定义类型结构体
variable adj.易变的,多变的;时好时坏的;可变的,可调节的; (数)(数字)变量的;(植,动)变异的,变型的࿱…...
【SpringBoot框架篇】37.使用gRPC实现远程服务调用
文章目录 RPC简介gPRC简介protobuf1.文件编写规范2.字段类型3.定义服务(Services) 在Spring Boot中使用grpc1.父工程pom配置2.grpc-api模块2.1.pom配置2.2.proto文件编写2.3.把proto文件编译成class文件 3.grpc-server模块3.1.pom文件和application.yaml3.2.实现grpc-api模块的…...
投资的三个匹配
许多人亏钱都是犯了同样错误,要么对投资的预期过高,要么是投资期限不匹配,要么是波动承受能力不匹配。投资想要赚钱,先解决匹配问题。 1.预期收益率要匹配 就是明确自己做投资,每年想赚多少钱。凡事都要有个目标&…...
[Netty实践] 请求响应同步实现
目录 一、介绍 二、依赖引入 三、公共部分实现 四、server端实现 五、client端实现 六、测试 一、介绍 本片文章将实现请求响应同步,什么是请求响应同步呢?就是当我们发起一个请求时,希望能够在一定时间内同步(线程阻塞&am…...
Java进阶—哈希冲突的解决
1. 什么是哈希冲突 哈希函数:哈希函数是一种将输入数据(键)映射到固定大小范围的输出值(哈希值)的函数。哈希函数通常用于存储 数据存储和检索领域,例如哈希表中。 哈希表:哈希表(Hash Table),也成为哈希映射(Hash Map)或字典&…...
css的border详解
CSS的border属性是一个简写属性,用于设置以下四个边框属性: border-width:定义边框的宽度。可以使用具体的像素值,或者使用预定义的关键字如thin、medium和thick。border-width不支持百分比值。默认情况下,边框的宽度是…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
