leetcode 208. 实现 Trie (前缀树)【字典树(前缀树)的介绍与思路整理】

news2025/1/16 15:57:45

题目

Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 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 trie = new Trie();trie.insert(“apple”);trie.search(“apple”); // 返回 Truetrie.search(“app”); // 返回 Falsetrie.startsWith(“app”); // 返回 Truetrie.insert(“app”);trie.search(“app”); // 返回 True

题解:

字典树(前缀树)的介绍

字典树是什么?

字典树是一种树型结构,它是hash树的一种变种。其有大量的应用,比如搜索引擎中用于文本词频统计。其优点是利用字符串的公共前缀来减少查询时间,减少字符串的比较次数。

直接用列子来说明字典树是什么。现假设有有b,abc,abd,bcd,abcd,efg,hii 这6个单词。那么我们看看基于这几个单词如何来构建字典树。这里假设所有字符均是小写字母
对于单词b,构建结果如下图。
image.png
同时由于b也是该单词的重点因此需要对其进行标记,用红色标记为终止节点。
image.png
接下来看abc单词。
image.png
接下来把bcd单词插入到字典树中如下图所示。
image.png

把所有的单词插入到字典树之后如下图所示。

image.png
因此字典数据的构建就完成了。到这里其实就可以根据题目要求来写代码了。

题目分析

可见字典树的节点的数据结构有两个关键,一个是指向children的指针列表,一个是表示是否是字符串终点的flag
主要有三个函数:

  • 插入字符串
    主要有两种情况:1如果当前字符在子节点中存在则继续向下遍历,2 如果不存在则创建一个新子节点。这里遍历完所有字符最后别忘了把最后的节点标记为字符串终点。
  • 搜索字符串
    这个其实也类似也分两种情况,如果字符串没找到直接 false,如果找到最后一个不是字符串终点也是false,否则为true。
  • 搜索前缀这个跟搜索字符串类似但是不用考虑是否是字符串终点了
    代码如下:
class Trie:

    def __init__(self):
        #子节点
        self.children=[None]*26
        self.isEnde=False
        


    def insert(self, word: str) -> None:
        node=self
        for ch in word:
            num=ord(ch)-ord("a")
            #如果该字符不在其子节点中则创建一个
            if not node.children[num]:
                node.children[num]=Trie()
            #node跳到下一节点
            node = node.children[num]
        node.isEnde=True


    def search(self, word: str) -> bool:
        node =self
        for ch in word:
            num=ord(ch)-ord("a")
            if node.children[num]:

                node=node.children[num]
            else:
                return False
        if node.isEnde:
            return True
        return False
        


    def startsWith(self, prefix: str) -> bool:
        node = self
        for ch in prefix:
            num=ord(ch)-ord("a")
            if node.children[num]:
                node=node.children[num]
            else:
                return False
        return True

计算复杂性:

  • 时间复杂性:构建树的复杂性为 O ( S ) O(S) O(S),S表示每次插入与查询的字符串长度。查询的复杂度是固定的也是 O ( S ) O(S) O(S),因此整体的复杂度为 O ( S ) O(S) O(S)
  • 空间复杂度:这里每个子节点其实有占用了26个空间,因此空间复杂性为 O ( T ) O(T) O(T),T表示所有插入字符串的长度和。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCL Notes/Domino 12.0.2版本正式发布

大家好,才是真的好。 之前代号为多瑙河版本的Notes/Domino产品,昨天晚上正式露出了神秘的面纱,版本号也正式定为12.0.2。从版本上来看,是12.0版本的小版本,但从功能和特性上来说,这完全就是一个大版本。 …

Duboo优雅关闭(附源码分析)

Dubbo优雅关闭 1. 关闭有什么问题 当服务提供方要上线的时候,一般是通过部署系统完成实例重启。在这个过程中,服务提供方的团队并不会事先告诉调用方他们需要操作哪些机器,从而让调用方去事先切走流量。而对调用方来说,它也无法…

LeetCode刷题复盘笔记—一文搞懂动态规划之72. 编辑距离问题(动态规划系列第四十一篇)

今日主要总结一下动态规划的一道题目,72. 编辑距离 题目:72. 编辑距离 Leetcode题目地址 题目描述: 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&…

FME对调查云平台完成变更调查照片的批量迁移

目录 前言 二、实际步骤 1.准备基础数据 2.模拟登录 3.获取图斑标识码 4.获取图形信息 5.通过空间位置关系过滤不合格照片 5.通过深度学习模型过滤照片特征错误图斑 6.照片迁移 总结 前言 又到了一年一度国土变更调查的苦日子,因为项目规则原因,…

【架构设计】你的应用该如何分层呢?

前言 最近review公司的代码,发现现在整个代码层级十分混乱,一个service类的长度甚至达到了5000多行。而且各种分层模型DTO、VO乱用, 最终出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动一处就牵一发而动全身等问题。 我们在吸取了阿里…

spring之aop底层实现

1.aop之ajc增强 什么是ajc增强? ajc是aop的另外一种实现, 通过aspectj编码器来改动class源文件实现aop 2.aop之agent增强 什么是agent增强? agent是aop的另外一种实现,是通过类加载时改动class类 3.aop之proxy增强-jdk代理 …

Mac系统入门之电脑卡死怎么办

当你兴冲冲的从菜鸡驿站提回来一台新的电脑,你欣喜若狂,迫不及待的拆开快递箱,里面是一台苹果电脑,这时,你不禁抓耳挠腮:Mac系统怎么用啊? 下面,这篇专栏教你如何入门Mac系统 https://blog.csdn.net/cyyyyds857/category_12163999.html –––––前言 你正兴致勃勃的写着…

mysql中字符串拼接、填充和切片

一、本文主要结构 在编程过程往往会遇到,多个字符串需要进行拼接或者填充固定值或者截取部分数据,本文主要实战下面四个函数 concat(str1, str2,…):字符串进行拼接 lpap():左边填充 rpad(&…

【C语言】指针经典题分析

🏖️作者:malloc不出对象 ⛺专栏:《初识C语言》 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一、指针与数组经典题解析二、经…

创新的概念、设计和生产鞋类和鞋类软件丨Jevero及Botcha 3D功能简介

Jevero功能简介 重新定义鞋类发展 Jevero是图案工程师、鞋类开发人员和设计师的优秀支持。从设计到生产都在一个工具中完成。 产品功能及优势 01、更快的开发,缩短上市时间 Jevero使您的图案工程师、鞋类开发人员、工业设计师之间能够进行协作。利用Rhino平台产…

两数相加 java语言

leetcode地址:两数相加描述:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除…

DevData Talks | 张乐、茹炳晟、应阔浩、任晶磊:研发效能实践的2022年复盘和展望

跌宕起伏的 2022 年已经成为过去时。在这一年,我们既看到外部环境变幻莫测,也看到研发效能行业沉下心来稳步发展,从宏大的概念和价值,转向具体的问题,和务实、可行动的解决方案。 在新一年的开端上回望,20…

靶机测试CyNix笔记

靶机测试CyNix笔记 靶机描述 Level: Intermediate-HardUser flag: user.txtRoot flag: root.txtDescription: It’s a Boot2Root machine. The machine is VirtualBox compatible but can be used in VMWare as well (not tested but it should work). The DHCP will assign …

webpack中模块加载器Loader、插件plugins、optimization属性

目录 模块加载器(Loader) 导入css文件 加载图片 方法一 方法二 转换es6(向下兼容es5) html代码组件导入导出 导入less文件 自定义loader(Markdown文件加载器) markdown-loader.js文件 webpack.c…

【Linux】程序的翻译过程(图示详解)

因为淋过雨,所以懂的为别人撑伞;因为迷茫过,所以懂得为别人指路。 我们都知道写好代码后,编译器会帮助我们把代码生成可执行程序,细加了解又会知道程序的生成又分为四步:预处理、编译、汇编、链接。那么这四…

STM32MP157驱动开发——Linux IIO驱动(上)

STM32MP157驱动开发——Linux IIO驱动(上 )0.前言一、IIO 子系统简介1.iio_dev 结构体2.iio_dev 申请与释放3.iio_dev 注册与注销4.iio_info5.iio_chan_spec二、驱动开发1. ICM20608 的 IIO 驱动框架搭建2.IIO 设备申请与初始化3.基于以上驱动框架开发 I…

[JavaEE初阶] 线程安全问题的原因和解决方案

努力努力,月薪过亿!!! 格局打开~~~ 文章目录前言1. 线程安全问题的概念2. 线程安全问题的原因3. 线程安全问题解决--加锁3. synchronized4. 死锁4.1 产生死锁的情况4.3 产生死锁的必要条件4.4 避免死锁的方法前言 线程安全这里可能会出道面试题,在日常工作中也是很重要的内容.…

MathType公式对齐不正确

MathType公式对齐不正确1.软件环境⚙️2.问题描述🔍3.解决方法🐡4.1.通过标尺对齐4.2.通过输入具体的制表符位置对齐1.软件环境⚙️ Windows10 教育版64位 Word 2021 MathType 7 2.问题描述🔍 在使用Word写论文的时候,总是避免不…

JavaScript 模块:理解模块系统

前言 现代JavaScript开发毋庸置疑会遇到代码量大和广泛使用第三方库的问题。解决这个问题的方案通常需要把代码拆分成很多部分,然后再通过某种方式将它们连接起来。 在ECMAScript 6模块规范出现之前,虽然浏览器原生不支持模块的行为, 但也迫…

ssh连接ubuntu报错

记录问题:1我在本机windows用ssh rootubuntu连接失败 显示端口21啥的2 打开Ubuntu系统,输入ps -e|grep ssh,发现只有agent,没有server3 安装ssh server,输入sudo apt-get install openssh-server,发现报错信…