C++实现前缀树

在这里插入图片描述

文章目录

  • 1. 什么是前缀树
  • 2. 前缀树的实现
    • 2.1 前缀树的基本结构
    • 2.2 插入
    • 2.3 word出现了几次
    • 2.3 word作为前缀出现几次
    • 2.4 删除

1. 什么是前缀树

假设这里有一个字符串数组,和一个树的根结点:
在这里插入图片描述
这个结点的pass意思是:有几个字符通过了这个结点。end的意思是:有一个字符串是以这个结点结尾的

第一个字符串:“abc”,从头结点开始出发。我们首先看有没有a这条路,没有a这条路我们就创建。
在这里插入图片描述
创建这条路后,我们到下一个结点。因为已经到了这个结点,所以下一个结点的pass也加1。

然后我们再看b,也没有b这条路,我们再创建b。
在这里插入图片描述
我们再看c,也没有,我们再把c的路创建出来。
在这里插入图片描述
因为c是结尾,在c下一个结点中我们要把end加1。

我们再看"abd"这个字符串,从根结点开始出发,a有这条路,b有这条路,但是d没有这条路,我们就需要创建d这条路。
在这里插入图片描述
那么"bc"这个字符串,要从根结点开始,根结点下面没有b这条路,所以我们还是要创建。
在这里插入图片描述
其它的都是一样思路,那么这个前缀树它能做些什么呢?我们可以求每个字符串出现了多少次,和求某个字符串是否是前缀字符串。

2. 前缀树的实现

2.1 前缀树的基本结构

在这里插入图片描述
我们在结点里加了一个map的作用是记录当前结点的下级有多少条路和每条路结尾的结点。

2.2 插入

在这里插入图片描述

2.3 word出现了几次

在这里插入图片描述
这里我们只需要一直找路,如果路为空了,就说明没有这个字符串,我们直接返回0。如果一直到字符串找完,我们看最后结点的end是几,这个字符串就说明出现了几次。

2.3 word作为前缀出现几次

在这里插入图片描述
这个和上面是同样的道理,只是这样改成了最后结点的pass个数。

2.4 删除

在这里插入图片描述
假设我们想删除"abd"这个字符串,一开始就让根结点的pass减减,然后我们找到下一个结点的位置先减减,看它的pass为不为0。
在这里插入图片描述
不为0,我们继续往下,先pass减减看它为不为0。
在这里插入图片描述
不为0,我们继续往下,先pass减减看它为不为0。
在这里插入图片描述
此时结点的pass为0了,我们就需要让这个结点和这个结点以下的结点全部析构。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu下Thrift安装

thrift是一种常用rpc框架,工作中经常会用到,本文记录一下其安装过程。 目录 1.下载软件包 1.1thrift下载 1.2libevent下载 1.3boost下载 2.安装(注意步骤) 2.1安装libevent 2.2安装boost 2.3安装与Python2.7版本对应的py…

【工作感悟】老程序员总结的四条工作经验教训

文章目录前言1. 不要做小需求2. 要做大需求3. 定期同步工作进度4. 项目结束,主动复盘总结前言 想来从事互联网工作已经很多年了,已经从当初的懵懂少年逐渐退化成老油条。刚毕业的时候,真是个愣头青,什么都不懂,也什么…

UE4 回放系统升级到UE5之后的代码报错问题解决

关键词: UE4 回放系统 升级 UE5 报错 DemoNetDriver GetDemoCurrentTime GetDemoTotalTime 背景 照着网上教的UE4的回放系统,也叫重播系统,英文Replay。做完了,测试运行正常,可升级到UE5却报了一堆 WorldSetting 和 …

计算机组成原理——第五章中央处理器

半生风雨半生伤,半醉半醒半心凉 文章目录前言5.1 CPU的功能和基本结构5.2 指令周期的数据流5.3.1 单总线结构5.3.2 专用通路结构前言 之前我们就说过CPU主要包括两个部分,运算器和控制器,运算器主要是实现算数运算.逻辑运算, 运算…

亲测:腾讯云轻量应用服务器性能如何?

腾讯云轻量应用服务器性能评测,轻量服务器CPU主频、处理器型号、公网带宽、月流量、Ping值测速、磁盘IO读写及使用限制,轻量应用服务器CPU内存性能和标准型云服务器CVM处于同一水准,所以大家不要担心轻量应用服务器的性能,腾讯云百…

springboot项目中的mysql用国产数据库达梦替换的相关说明

一、 用“DM管理工具”的“管理用户”创建你需要用户,也是达梦的模式。 用户的权限问题可以直接角色授权,方便一些。 二、借用达梦的“DM数据迁移工具”做数据库的表内容转移。 1. 新建工程、新建迁移 编辑mysql的数据库源 编辑达梦的目的端数据库 选择之…

应届生通过Java培训班转行IT有前途吗?

借用邓小平同志曾说过的一句话:科学技术是第一生产力。IT行业作为科技行业中的一员,不管是在自身的发展,还是支持其他行业的发展中都扮演了不可或缺的角色,“互联网”是社会发展的趋势,前途是无限的。而计算机语言是目…

春季儿童吃什么有助于长高,3款适合孩子长高的食谱做法,学起来

儿童身高一直以来都比较受到父母的关注,虽然身高不能说明一个人的能力有多强,但是会影响到人的外表。身高影响成败,一些专业对身高要求非常严格,因此大部分家长都希望孩子在身高方面能有一定的优势。 春季是孩子分泌生长激素增加时…

你了解C语言中的数组指针和函数指针吗?

如题,本篇文章重点讲解C语言中的数组指针和函数指针。这2种指针其实都不是很常用,个人感觉使用起来代码的可读性不是很高,但是还是需要了解一下。 数组指针 数组指针,即指向数组的指针,是用来存放数组的地址的。那如…

Redis Lua沙盒绕过命令执行(CVE-2022-0543)

一、描述 影响范围:Debian系得linux发行版本Ubuntu Debian系得linux发行版本 其并非Redis本身漏洞,形成原因在于系统补丁加载了一些redis源码注释了的代码 揭露时间:2022.3.8 二、原理 redis在用户连接后可以通过eval命令执行Lua脚本&#x…

Flutter成不了“顶流明星”的7大理由

Flutter是一款由Google推出的跨平台移动应用开发框架,近年来备受关注。尽管Flutter在某些方面表现出色,但仍然有一些人对它的发展前景表示怀疑。近期一些文章针对Flutter的发展提出了不少质疑和批评,称其难以成为移动应用开发的“顶流明星”&…

[Java]面向对象高级篇

文章目录包装类包装类层次结构基本类型包装类特殊包装类数组一维数组多维数组可变长参数字符串String类StringBuilder类内部类成员内部类静态内部类局部内部类匿名内部类Lambda表达式方法引用异常机制自定义异常抛出异常异常的处理常用工具类数学工具类随机数数组工具类包装类 …

在线文章生成工具-原创文章生成工具

在线文章生成器 在线文章生成器是指一种可以在线使用的自动化创造文章的工具。它可以使用自然语言处理(NLP)技术和人工智能算法提供需要的信息,基于标题、关键字,句子关联性等元素自动创造文章内容,涵盖各种类型&…

Java中线程的常用操作-后台线程、自定义线程工厂ThreadFactpry、join加入一个线程、线程异常捕获

场景 Java中Thread类的常用API以及使用示例: Java中Thread类的常用API以及使用示例_霸道流氓气质的博客-CSDN博客 上面讲了Thread的常用API,下面记录下线程的一些常用操作。 注: 博客:霸道流氓气质的博客_CSDN博客-C#,架构之…

Win10,详细永久关闭更新方法(附图文)

一、服务设置 1.同时按下键盘 Win R,打开运行对话框,然后输入命令 services.msc ,点击下方的“确定”打开服务。 2.找到 Windows Update 这一项,并双击打开。 3.停止该服务,启动类型设置为禁用 4.点击恢复&#…

完整指南:如何安装Man手册

Man手册简介 man手册是Unix和类Unix操作系统中的命令行工具,用于提供关于特定命令、函数和文件的帮助文档。它通常包含命令的语法、选项、参数、示例以及其他相关信息。man手册可以通过在终端输入"man"命令,后跟要查看的命令或函数名称来访问…

惠普Probook455电脑开机突然卡住无法进入桌面

惠普Probook455电脑开机突然卡住无法进入桌面解决方法分享。最近有用户使用的惠普Probook455电脑在开机的时候,电脑一直卡在开机的界面上,无法进入到系统中。无论是重启还是安全模式都无法解决问题。那么遇到这个情况怎么去进行问题的解决,来…

远程组态管理的好处

远程组态管理可以简化管理工作,帮助您节省时间和金钱。远程组态管理可以通过各种应用程序来实现,包括: •监控所有设备的状态,以确保它们正常工作。 •记录现场数据,例如温度,压力或流量。 •快速、轻松地…

CSDN粉丝首破一千关,有你名字

2023-4-11,CSDN粉丝首破一千关。 感谢词版本1,哈哈哈哈哈哈哈哈 在编程世界里,人们可以像创造生命一样创造程序,而我对这种创造和创新的热情,从我的csdn博客社区粉丝首次突破一千人的消息中得到了极大的满足和激励。作为一个Pyth…

全面解析反欺诈(羊毛盾)API,助你识别各类欺诈风险

前言 反欺诈(羊毛盾)反机器欺诈 API,是一种基于大数据分析和模型产品的技术,通过输入手机号、手机 IP 地址进行检测,帮助客户识别大量存在恶意的账号。 反欺诈(羊毛盾)API 的作用 反欺诈&…