Trie树之字符串统计问题

         这是C++算法基础-数据结构专栏的第二十七篇文章,专栏详情请见此处


引入

        Trie树,即字典树,顾名思义,就是用类似字典的方式存储数据,而Trie树最经典也是最简单的一个应用就是字符串统计问题。

        字符串统计问题就是维护一个字符串集合,并支持两种操作:向集合中插入一个字符串和询问一个字符串在集合中出现了多少次。

        下面我们就来讲Trie树之字符串统计问题的实现。

定义

        Trie树,即字典树,顾名思义,就是用类似字典的方式存储数据,它是AC自动机的主要组成部分,它的最经典应用是字符串统计问题和最大异或对问题。

过程

        例题

        题目大意:维护一个字符串集合,并支持两种操作:向集合中插入一个字符串和询问一个字符串在集合中出现了多少次。

        算法

        对于Trie树,每道题会有相对应的一种存储方式,而在这一题中,我们建立一棵树,用点来代表字母,而从根结点到树上某一结点的路径就代表了一个字符串。

        具体来说,我们定义一个数组son[][]存储树中每个节点的子节点,其中数组的一维表示节点的编号,二维的数字代表了这条边在字母表中的次序(例如son[5][3]表示5号节点连接了字符c的节点编号);然后,为了方便识别Trie树中每个字符串的结尾处,我们在相应的节点打上标记并累计,所以我们开一个数组cnt[];最后,还需要一个变量idx,以便于分配新的节点编号。

        然后,我们实现两个函数:insert(),向集合中插入一个字符串和query(),询问一个字符串在集合中出现了多少次。

        insert()函数的实现很简单:遍历字符串,若当前字符不存在,我们就新建一个节点并分配编号,直到遍历结束,我们在字符串末尾打上标记。

        query()函数的实现和insert()函数大体相同:遍历字符串,若当前字符不存在,就直接退出寻找,返回0,最后若没有退出寻找,返回所对应的标记的出现次数。

        Trie树的结构非常好懂,实际上,它的节点中不仅能存储字符,还可以存储数字和一些别的东西,在下一篇文章中,Trie树则存储了二进制数字,具体内容请期待下周周六我所发的文章。

代码

        下面给出Trie树之字符串统计问题的实现代码:

int son[N][26],cnt[N],idx;void insert(char *str){int p=0;for(int i=0;str[i];i++){int u=str[i]-'a';if(!son[p][u]) son[p][u]=++idx;p=son[p][u];}cnt[p]++;
}int query(char *str){int p=0;for(int i=0;str[i];i++){int u=str[i]-'a';if(!son[p][u]) return 0;p=son[p][u];}return cnt[p];
}

上一篇-KMP算法的实现    C++算法基础专栏文章    下一篇-Trie树之最大异或对问题


每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容

点个赞,关注一下呗~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务即时通讯系统】——etcd一致性键值存储系统、etcd的介绍、etcd的安装、etcd使用和功能测试

文章目录 etcd1. etcd的介绍1.1 etcd的概念 2. etcd的安装2.1 安装etcd2.2 安装etcd客户端C/C开发库 3. etcd使用3.1 etcd接口介绍 4. etcd使用测试4.1 原生接口使用测试4.2 封装etcd使用测试 etcd 1. etcd的介绍 1.1 etcd的概念 Etcd 是一个基于GO实现的 分布式、高可用、一致…

分库分表还是分布式?如何用 OceanBase的单机分布式一体化从根本上解决问题

随着企业业务规模的不断增长,单机集中式的数据库系统逐渐难以承载企业日益增长的数据存储与处理需求。因此,MySQL 的分库分表方案成为了众多企业应对数据存储量激增及数据处理能力需求扩张的“止痛药”。尽管这一方案短期内有效缓解了企业面临的大规模数…

在新ARM板上移植U-Boot和Linux指南

序言 从支持一个定制板子在U-Boot和Linux中的过程中得到经验以一个带有知名SoC(i.MX6)且IP已经得到支持的板子为例,这次讨论几乎不涉及编码技能,更多地聚焦在U-Boot部分 一般原则 如果您有您的BSP(板级支持包&#…

【全新课程】正点原子《基于GD32 ARM32单片机项目实战入门》培训课程上线!

正点原子《基于GD32 ARM32单片机项目实战入门》全新培训课程上线啦!正点原子工程师手把手教你学!彻底解决ARM32单片机项目入门难的问题! 一、课程介绍 本课程专为ARM32单片机的入门学习者设计,涵盖了环境搭建、编程软件使用、模…

【数学分析笔记】第3章第4节闭区间上的连续函数(2)

3. 函数极限与连续函数 3.4 闭区间上的连续函数 3.4.4 中间值定理 【定理3.4.4】若 f ( x ) f(x) f(x)在 [ a , b ] [a,b] [a,b]上连续,则它一定能取到最大值 M M M与最小值 m m m之间的任何一个值。 M max ⁡ f ( x ) , x ∈ [ a , b ] , m min ⁡ f ( x ) , …

【前端框架对比和选择】React 与 Vue 框架设计思路对比

框架总览 前端框架繁多,在学习的时候也会陷入困惑,我们应该抓住最主流的内容 Vue/React,深入底层,尝试揣摩框架作者的设计思路,开阔前端培训自己的视野,大家也不要把自己限制在框架之中,认为工…

常见区块链数据模型介绍

除了加密技术和共识算法,区块链技术还依赖于一种数据模型,它决定了信息如何被结构化、验证和存储。数据模型定义了账户如何管理,状态转换如何发生,以及用户和开发者如何与系统交互。 在区块链技术的短暂历史中,数据…

数据治理005-血缘关系

数据血缘是元数据产品的核心能力,但数据血缘是典型的看起来很美好但用起来门槛很高的技术,只要你采买过元数据产品就知道了。这篇文章对数据血缘的特征、价值、用途和方法做了系统阐述: 1、特征:归属性、多源性、可追溯及层次性 2…

SAP已知事务码查询关联角色

运维期间客户就出现没有某些事务码的权限,要求添加; 想要添加事务码就必须知道这个事务码属于哪个角色;使用SUIM-角色-按菜单中的事务分配,输入事务码,点击执行就可以查看 找到相关的角色之后,用SU01添加至…

动态规划算法:12.简单多状态 dp 问题_打家劫舍_C++

目录 题目链接:LCR 089. 打家劫舍 - 力扣(LeetCode) 一、题目解析 题目: 解析: 二、算法原理 1、状态表示 状态表示: 2、状态转移方程 状态转移方程推理: 3、初始化 dp表初始化: 特殊…

【抓包工具】如何下载抓包工具Fiddler

目录 Fiddler简介 Fiddler下载步骤 Fiddler安装步骤 配置Fiddler抓取HTTPS Fiddler简介 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据&#xff08…

【BurpSuite】SQL注入 | SQL injection(1-2)

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 【BurpSuite】SQL注入 | SQL injection(1-2) 实验一 Lab: SQL injection vulnerability in WHERE clause…

大数据新视界 --大数据大厂之数据压缩算法比较与应用:节省存储空间

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

2-105 基于matlab的GA-WNN预测算法

基于matlab的GA-WNN预测算法。遗传算法优化小波神经网络的步骤:1设种群规模为M。随机生成初始种群N , 采用实数编码对个体Ni编码。2、用1中的种群N训练, WNN参数由初始化获得。3、计算种群N中个体适应度值。满足终止条件则跳至6, 不满足执行4。4、适应度大的个体, 选…

携手SelectDB,观测云实现性能与成本的双重飞跃

在刚刚落下帷幕的2024云栖大会上,观测云又一次迎来了全面革新。携手SelectDB,实现了技术的飞跃,这不仅彰显了观测云在监控观测领域的技术实力,也预示着我们可以为全球用户提供更加高效、稳定的数据监测与分析服务。这一技术升级&a…

智慧园区建设,构建智能监控和安防体系

智慧园区是指运用先进的信息技术和互联网思维,以提升园区管理和服务水平为目标,通过整合各类资源、优化园区运营,打造智能化、智能、绿色、低碳的现代园区。在智慧园区中,智慧楼宇、智能监控、智慧消防和智慧安防是不可或缺的重要…

SpringBoot整合JPA实现CRUD详解

SpringBoot版本是2.0以上(2.6.13) JDK是1.8 一、依赖 <dependencies><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><!--…

【ADC】SAR 型 ADC 和 ΔΣ ADC 的选型决策方法

本文学习于TI 高精度实验室课程&#xff0c;介绍如何选择 SAR 或 delta-sigma 型 ADC。 文章目录 一、选型决策树二、特定传感器的应用三、需要 DC 精度但分辨率较低的应用四、需要 DC 精度且分辨率较高的应用五、极低噪声的 DC 精密测量六、需要捕获瞬态信号值的应用七、需要高…

vue单点登录异步执行请求https://xxx.com获取并处理数据

一、请求一个加密地址获取access_token再拼接字符串再次请求 接口返回数据 异步执行请求该地址获取数据并处理 二、请求代码第二步使用 access_token 获取 auth_key // 第二步&#xff1a;使用 access_token 获取 auth_keyconst access_token tokenData.access_token;const …

13年408计算机考研-计算机网络

第一题&#xff1a; 解析&#xff1a;OSI体系结构 OSI参考模型&#xff0c;由下至上依次是&#xff1a;物理层-数据链路层-网络层-运输层-会话层-表示层-应用层。 A.对话管理显然属于会话层&#xff0c; B.数据格式转换&#xff0c;是表示层要解决的问题&#xff0c;很显然答案…