【算法】Tire字符串

news2025/1/11 10:50:28

作者:指针不指南吗
专栏:算法篇

🐾或许会很慢,但是不可以停下🐾

文章目录

  • 1.Trie的基本思想
    • 1.1什么是Trie
    • 1.2字符串条件
    • 1.3如何存储字符串
    • 1.4如何查找字符串
  • 2.Trie的代码实现
    • 2.1怎么用数组建树
    • 2.2完整代码

1.Trie的基本思想

1.1什么是Trie

Trie是用来快速高效查找和查找字符串集合的数据结构。

1.2字符串条件

字符串需要 全是大写,全是小写,0或者1,数字

为什么不能是汉字呢?

因为我们需要把字符串的每个字符映射到每个数组里面去存储,比如全是小写英文的我们需要数组大小为26,那如果是汉字的话,要开个几万的数组,有点麻烦困难,所以字符串都是上述几种情况。

1.3如何存储字符串

具体过程如下(图是借用acwing佬的)

用树来存储字符串;

根节点为0,这里省略根节点;

比如存储字符串abcd

  • 从第一个节点开始,如果第一个节点是a,就往下走,否则就创建一个 a
  • 然后是第二个字符b,找第一个节点的son 如果,sonb,就继续找下找,否则就创建一个
  • 依次往下直到最后一个字符d,最后在字符结束的地方,标记一下

在这里插入图片描述

1.4如何查找字符串

同样利用上图,而且和存储操作很相似

比如查找字符串abcd :

  • 从第一个节点开始,如果是 a ,就通过它的son找下一个字符b,没有a 字符,返回0;
  • 找第二个字符b,通过第一个节点的son 查找,如果是,找下一个,没有返回0;
  • 直到找到最后一个,如果能找到最后一个,并且最后一个上面有字符串结束的标志,返回字符串的个数;

2.Trie的代码实现

先放例题,便于理解

Trie字符串统计

维护一个字符串集合,支持两种操作:

  1. I x 向集合中插入一个字符串 x;
  2. Q x 询问一个字符串在集合中出现了多少次。

共有 N 个操作,所有输入的字符串总长度不超过 105105,字符串仅包含小写英文字母。

输入格式

第一行包含整数 N,表示操作数。

接下来 N 行,每行包含一个操作指令,指令为 I xQ x 中的一种。

输出格式

对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。

每个结果占一行。

数据范围

1≤N≤ 2 ∗ 1 0 4 2*10^4 2104

输入样例:

5
I abc
Q abc
Q ab
I ab
Q ab

输出样例:

1
0
1

2.1怎么用数组建树

这里比较难懂重点, 我们用一个二维数组去建树 son[N][26]

一维是现在位置是第几个结点(下标),二维是结点和结点之间的关系(谁是谁儿子);

比如son[0][1]=3, [0]表示根节点,[1]表示它有一个儿子b,这个儿子的下标是3;

接着如果有son[3][4]=8 ; 说明根节点的儿子b也有一个儿子c,这个孙子的下标就是8;

这样传递下去,就是一个字符串。

随便给一个结点son[x][y] 并不能看出它在第几层,只能知道,它的儿子是谁。

2.2完整代码

#include<iostream>
using namespace std;

const int N=200010;
int son[N][26],idx,cnt[N];
char str[N];

void insert(char *str)
{
    int p=0;  //从根节点开始,找字符
    for(int i=0;str[i];i++)  //字符串是以'\0'结尾的,可以当作是判断条件
    {
        int u=str[i]-'a';  //把26个英文字母映射到 数字 0~25,便于数组存储
        if(!son[p][u]) son[p][u]=++idx;  //如果该节点为空,就创建一个节点,把字符存进去
        p=son[p][u];  //找它的儿子,继续
    }
    cnt[p]++;  //在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;  //没有想要的节点,说明字符不存在,返回0
        p=son[p][u];  //下一个节点,继续查找下一个字符
    }
    return cnt[p];  //可以按着这个路径走下来,说明有这个字符串,返回字符串的数量
}

int main()
{
    int n;
    cin>>n;
    
 
    while(n--){
        
        char op[2];
           
        scanf("%s%s",op,str);
        
        if(*op=='I') insert(str);
        else printf("%d\n",query(str));
        
    }
    return 0;
}

Alt

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

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

相关文章

柔性电路板的优点、分类和发展方向

柔性电路板是pcb电路板的一种&#xff0c;又称为软板、柔性印刷电路板&#xff0c;主要是由柔性基材制作而成的一种具有高可靠性、高可挠性的印刷电路板&#xff0c;具有厚度薄、可弯曲、配线密度高、重量轻、灵活度高等特点&#xff0c;主要用在手机、电脑、数码相机、家用电器…

CSGO社区服搭建服务器架设游戏服务端教程

CSGO社区服搭建服务器架设游戏服务端教程 我是艾西&#xff0c;上一篇说了搭建CSGO服务器需要准备服务器以及安装好所需要的环境&#xff0c;那么今天说一下CSGO社区私人服务器怎么搭建游戏服务端 搭建CSGO服务器比较简单&#xff0c;Valve开发者社区wiki也给出了安装指导&…

仓库管理如何实现扫码出入库?

仓库实现扫描出入库管理具体应该怎么做&#xff1f;以下方参考模板为例&#xff0c;可以点击打开配合阅读&#xff1a; 参考模板&#xff1a;通用仓库管理&#xff08;官方&#xff09;① 库存卡设计&#xff1a; 此表单主要用于代替传统纸质库存卡的记录功能&#xff0c;货物…

【备战面试】每日10道面试题打卡-Day1

本篇总结的是Java基础知识相关的面试题&#xff0c;后续也会更新其他相关内容 文章目录1、JVM、JRE和JDK的关系&#xff1f;2、Java语言有哪些特点&#xff1f;3、Java和C的区别有哪些&#xff1f;4、Java有哪些数据类型&#xff1f;5、访问修饰符 public、private、protected&…

企业如何实现精细化人员管理?五大业务场景值得关注

近年来&#xff0c;随着大数据、人工智能和云计算等信息技术不断升级与渗透&#xff0c;处在数字化变革的劳动力密集型企业希望利用更加智能化的劳动力管理软件&#xff0c;帮助企业实现规范化的管理。 面对企业劳动力管理理念的变化&#xff0c;以及数字化转型的发展渗透&…

Puppeteer项目结构梳理

最近接触了一个个人感觉很奈斯的项目&#xff0c;故记录思路如下&#xff1a; puppeteer项目梳理&#xff1a; 入口文件 run.js 入口命令 node run.js YourConfig.json 1、我们可以在自己的config.json里面设置好 ①、登录的用户名密码;aws或其它服务器的access等id,accessKey…

二叉树的性质(概念/特性/存储结构)

目录1 二叉树的定义及主要特性1.1 二叉树的定义1.2 特殊二叉树1.2.1 满二叉树1.2.2 完全二叉树1.2.3 二叉排序树1.2.4 平衡二叉树1.3 二叉树的性质1.3.1 非空二叉树上的叶结点数1.3.2 非空二叉树第k层结点数1.3.3 高度为h的二叉树至多结点数1.3.4 完全二叉树结点与双亲的关系1.…

电子价格标签-系统结构

一、V2.4基站软件电子标签 接收PC下达的操作指令&#xff0c;解析后再通过RF发送给电子标签&#xff0c;接收路由器发送的数据信息并解析&#xff0c;更新数据。 1. 2.1寸电子价签 2. 2.9寸电子价签 ​ 3. 4.2寸电子价签 ​ 4. 7.5寸电子价签 ​ 5. 10.2寸电子价签 二、V4…

当审稿人回复这些审稿意见时,其实是在暗示你这些细节需要注意

当我们翘首以盼SCI论文投稿的审稿决定时。心情往往是复杂的&#xff0c;想收到审稿决定又担心收到的是不好的审稿决定。不管审稿结论如何&#xff0c;我们首先要明白的是那几个简短字母的审稿决定对我们来说&#xff0c;意味着什么。只有这样才有可能既不妄自菲薄也不杞人忧天。…

Intel CSME 简述

SME 算是 Intel X86 PC 上最神秘的部分了,本文根据 us-19-Hasarfaty-Behind-The-Scenes-Of-Intel-Security-And-Manageability-Engine 一文写成。讲述内容无法证伪,各位随便听听即可,了解这些能够帮助BIOS 工程师更好的理解一些操作的实现。文章基于 Intel 第八代第九代CPU(…

springCloud之seata

一、Seata是什么 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 官方文档 https://seata.io/zh-cn/docs/overview/wha…

发现新大陆——原来软件开发根本不需要会编码(看我10分钟应用上线)

目录 一、前言 二、官网基础功能及搭建 三、体验过程 01、连接数据源 02、设计表单 03、流程设计 04、图表呈现 05、组织架构设置 五、效率评价 六、小结 一、前言 众所周知&#xff0c;每家公司在发展过程中都需要构建大量的内部系统&#xff0c; 如运营使用的用户…

数据结构与算法基础-学习-14-线性表之串

一、串的定义由0-n个字符组成的有限序列。&#xff08;n>0&#xff09;二、串的相关术语1、子串串中任意个连续字符组成的子序列成为该串的子串。2、主串包含子串的串成为主串。3、字符位置字符在序列中的序号为该字符在串中的位置。4、子串位置子串第一个字符在主串中的位置…

Docker----------Docker轻量级可视化工具Portainer/监控之 CAdvisor+InfluxDB+Granfana

1.是什么 Portainer 是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 2 官网 官网 https://www.portainer.io/ https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux 3.…

【数电基础】——时序逻辑电路

目录 1.大纲 2.时序逻辑电路的特点 3.时序逻辑电路的一般形式 4.时序逻辑电路的描述方法 5.同步时序逻辑电路 6.异步时序逻辑电路 7.同步时序逻辑电路的分析方法&#xff08;上升沿触发的D触发器&#xff09; 8.同步时序逻辑电路的分析方法&#xff08;脉冲触发的JK触发…

Grafana邮件及告警配置

之前部署过服务器的监控组件程序&#xff0c;本在部署时也进行邮件及告警配置&#xff0c;但未进行文档整理&#xff0c;在这儿进行展示。之前用过Grafana的7.*的版本&#xff0c;在进行邮件配置还比较OK&#xff0c;但在配置告警时&#xff0c;太繁琐&#xff0c;还要自己去写…

Java数据结构LinkedList单链表和双链表模拟实现及相关OJ题秒AC总结知识点

本篇文章主要讲述LinkedList链表中从初识到深入相关总结&#xff0c;常见OJ题秒AC&#xff0c;望各位大佬喜欢 一、单链表 1.1链表的概念及结构 1.2无头单向非循环链表模拟实现 1.3测试模拟代码 1.4链表相关面试OJ题 1.4.1 删除链表中等于给定值 val 的所有节点 1.4.2 反转…

【H2实践】之认识 H2

一、H2 官网 H2 官网 http://www.h2database.com/html/main.html H2 是一款短小精干的 Java 内存数据库,性能强劲。 H2 的优点&#xff1a; 非常快的数据库引擎开源Java 编写支持标准 SQL, JDBC API内嵌和服务器模式&#xff0c;支持集群强大的安全特性可使用 PostgreSQL OD…

如何实现云原生?推荐的几个实用工具

云原生是一种软件开发和部署的方法&#xff0c;它依赖于容器、微服务和自动化运维。它能使应用更高效、可靠和可扩展&#xff0c;并适用于不同的云平台。 如果要更直接、更通俗地解释上述概念的话。 云的本源更准确地说是一种文化&#xff0c;一种潮流&#xff0c;它必然是云…

更新 Python 100道基础入门检测练习题【下篇】(附答案)

前言 大家早好、午好、晚好吖 ❤ ~ 爆肝更新 Python 100道基础入门练习题【篇上】 更多精彩内容、资源皆可点击文章下方名片获取此处跳转 实例021&#xff1a;猴子偷桃 题目&#xff1a; 猴子吃桃问题&#xff1a;猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xf…