Trie树【数组实现】

news2024/11/24 17:19:31

全文目录

  • Trie的表现形式
  • 数组实现 Trie 树
    • 代码

Trie的表现形式

Trie树主要用来实现字符串的存储和快速查找,其表现形式类似一颗多叉树,每个节点表示字符串的一个字符。由于可能会存在类似 "abc""abcde" 这样的数据,所以并不是只有叶子结点是字符串你的尾部,因此需要对每个字符串的尾部都进行标记。

在这里插入图片描述

数组实现 Trie 树

提示:

初学的时候代码可能会看得云里雾里的,这是很正常的,因为很抽象,所以强烈建议通过画图来进行加深理解。最好先去了解一下数组实现链表

通过题目来实现Trie树

在这里插入图片描述

虽然Trie树的逻辑结构是一个多叉树,但是在实现的时候我们是通过数组的形式来进行存储的,所以物理结构可能会有点扭曲,可以类比一下数组实现链表时的操作。

题目给出的 N 表示的是所有字符串的长度之和,也就是节点总个数(不是树的高度)。每个节点都会有26种情况(对应着26个字母),所以我们开出的数组是 son[N][26]它的一维表示的是当前节点位置,二维表示节点的值,里面存放的是下一个节点的位置。

字符串的结束需要标记,所以需要另外一个数组 cnt[N] 来进行存放。因为有 N 个节点,所以可能会有 N 中情况,所以需要开 N 个,它的下标表示最后节点的位置,里面存放的是以这个节点结束的字符串的个数

用图来表示就是:

在这里插入图片描述

代码

#include <iostream>
#include <string>

using namespace std;

const int N = 100010;   // 表示的是所有的字符串加起来的长度
int son[N][26];      // son 表示下一个节点的位置,它的一维是表示当前节点的位置,二维表示当前节点的值
int cnt[N];          // cnt 表示一个字符串最后的标记位
int n, index;   // index 表示下一个用到的节点,让在不同字符串中的相同字符所在的位置不同
string s;
char str[N];

// 插入操作
void add(char str[])
{
    int p = 0;  // 一维表示的是节点,所以从0开始
    for (int i = 0; str[i]; i++)
    {
        int u = str[i] - 'a';   // 节点的值
        if (!son[p][u]) son[p][u] = ++index;    // 没有节点就创建节点
        p = son[p][u];   // 走到下一个节点
    }
    
    cnt[p]++;   // 标记字符串结束
}

// 查询操作
int query(char str[])
{
    int p = 0;  // 一维表示的是节点,所以从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];  // 字符串的总个数
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> s >> str;
        if (s == "I") 
        {
            add(str);
        }
        else 
        {
            cout << query(str) << endl;
        }
    }
    
    return 0;
}

完结散花 🌈🌈🌈

在这里插入图片描述

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

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

相关文章

合成游戏开发方案

合成游戏是一种深受玩家喜爱的游戏类型&#xff0c;它将各种不同的元素结合起来&#xff0c;以创新的方式吸引玩家。在本文中&#xff0c;我们将探讨一种合成游戏的开发方案&#xff0c;包括游戏目标、游戏机制、游戏关卡、游戏核心元素以及未来发展方向。 游戏目标 我…

WebSocket的优缺点

WebSocket的优缺点 1. WebSocket概念 1.1 WebSocket优点 低延迟全双工长期运行双向实时通信 1.2 什么是心跳机制 为了保持WebSocket稳定的长连接,在建立连接后,服务器和客户端之间需要通过心跳包来保持连接状态,以防止连接因长时间没有数据传输而被切断. 心跳包是一直特殊…

国内外大语言模型调研(更新到2023.09.12)

目录 国外 OpenAI-ChatGPT Anthropic-Claude Google-Bard 国内 百度-文心一言 清华大学&智谱AI-ChatGLM 百川智能-百川大模型 科大讯飞-星火 阿里-通义千问 360-360智脑 腾讯-混元大模型 华为-盘古大模型 字节跳动-云雀大模型 好未来-MathGPT 商汤科技-商量…

abb PPC902AE101 3BHE010751R0101控制板

通信接口&#xff1a; 控制板通常配备了多种通信接口&#xff0c;以便与其他设备和系统进行数据交换。这些接口可能包括以太网、串行通信、Modbus等。 处理能力&#xff1a; 控制板可能具有一定的数据处理和计算能力&#xff0c;以执行控制算法、数据处理或逻辑功能。 数据存…

HiAI Foundation助力端侧音视频AI能力,高性能低功耗释放云侧成本

过去三年是端侧AI高速发展的几年&#xff0c;华为在2020年预言了端侧AI的发展潮流&#xff0c;2021年通过提供端云协同的方式使我们的HiAI Foundation应用性更进一个台阶&#xff0c;2022年提供视频超分端到端的解决方案&#xff0c;在2023HDC大会上&#xff0c;HiAI Foundatio…

喜讯连连!疆程重磅发布全球独家3.6 TFT- LCD AR-HUD及CMS产品及解决方案,并斩获年度TOP10供应商

9月7日至8日&#xff0c;2023世界显示产业大会在成都盛大启幕&#xff0c;同期由BOE&#xff08;京东方&#xff09;承办的“Define the Future 智能座舱生态论坛”&#xff0c;合肥疆程技术有限公司创始人兼总经理康栋受邀出席并发布两款重磅座舱解决方案。 本次论坛以“智能座…

VRTK4⭐二.VRTK4的项目基础配置

文章目录 &#x1f7e5; 硬件基本配置&#x1f7e7; 设置XR Plug-in Management&#x1f7e8; 添加项目Tilia&#x1f7e9; 配置项目Hierarchy &#x1f7e5; 硬件基本配置 解决使用OpenXR,HTC头显正常追踪,但手柄无法使用的问题. 问题如下: 当我们按照官方的标准流程配置完Op…

消息队列(一):需求分析

为什么要做这样一个项目&#xff1f; 首先&#xff0c;我们在之前学习的时候&#xff0c;就认识了一下 生产者消费者模式&#xff0c;这样一个模式有两大好处&#xff1a; 解耦合 本来有个分布式系统&#xff0c;A服务器 调⽤ B服务器&#xff08;A给B发请求&#xff0c;B给A…

中国智能卡车“遥遥领先”:卡车NOA落地5000万公里0事故,全球首个

智能车参考 | 公众号 AI4Auto 成熟的“擎天柱”&#xff0c;已经可以自己出去赚钱了。 此时此刻&#xff0c;遍及华东、华北、华南、西北…几乎全国所有主要货运干线上&#xff0c;都有智能重卡承运商单。 高速路段由卡车智能驾驶系统完全承担驾驶任务&#xff0c;自主控制油门…

中国社科院大学与美国杜兰大学能源管理硕士项目——喜欢可抵万难,加油!

人生起起伏伏&#xff0c;在我们与生活较量的过程中&#xff0c;每克服一道难题&#xff0c;便赢得了自我成就的依仗。慢慢的&#xff0c;我们放下了名利、物质和虚荣&#xff0c;但决不放弃对世界的求知欲以及对知识的渴望&#xff0c;虽然在职读研很苦很累&#xff0c;但喜欢…

【CesiumJS入门】(10)绘制多边形(动态实时画面)

前言 如果你是在寻求解决方案&#xff0c;可以直接用cesium-draw这个插件。 鼠标左键添加点、右键完成绘制,单击右侧弹窗关闭按钮清空绘制。参考沙盒示例&#xff1a;Drawing on Terrain 直接上代码了 /** Date: 2023-07-12 18:47:18* LastEditors: ReBeX 420659880qq.com* L…

安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR下级海康设备无法级联是什么原因?

安防视频监控平台/视频集中存储/云存储/磁盘阵列EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 有用户反馈&…

Excel、Jira、Bugfree 应该选哪个做bug管理?深度对比

如何选择最适合您团队的Bug管理系统&#xff1f;本指南提供了全面的选型建议&#xff0c;并深度对比了7类主流工具如PingCode、Jira、 Mantis等&#xff0c;涵盖功能、成本、易用性等多个关键因素。适用于软件开发团队、项目经理和决策者。 一、适合的BUG管理工具在产品开发中的…

华为云云耀云服务器L实例评测|在云耀云服务器L实例上部署经典小游戏battle-city坦克大战

文章目录 1 引言2 购买云耀云服务器2.1 华为账号2.2 华为云耀云服务器L实例 3 登录云服务器3.1 重置密码3.2 远程登录 4 安装Node.js4.1 下载4.2 解压4.3 环境配置4.4 确认Node版本4.5 其他 5 部署经典小游戏battle-city坦克大战5.1 下载5.2 安装5.3 启动游戏服务 6 在线访问ba…

如何实现CSDN评论区粉丝幸运抽选功能:一场代码与运气的碰撞

文章目录 前言抽选规则实现思路代码实现1.获取评论数据2.过滤符合抽选规则的评论者3.获取粉丝数据4.过滤符合抽选规则的粉丝5.增加公众号留言权重6.抽选粉丝 完整的代码效果展示结语 前言 为了回馈粉丝们一直以来的的关注和支持&#xff0c;我近期开启了赠书活动&#xff0c;活…

使用 Nginx 实现企业微信域名配置中的校验文件跳转

背景 在企业微信中配置业务域名时&#xff0c;通常需要在该域名的根路径下放置一个校验文件&#xff0c;以验证域名的所有权。然而&#xff0c;如果该域名是第三方的&#xff0c;你可能无法直接在根路径下放置文件。在这种情况下&#xff0c;你可以使用 Nginx 来实现校验文件的…

软件测试/测试开发丨使用ChatGPT自动进行需求分析

简介 在实际工作过程中&#xff0c;常常需要拿到产品的PRD文档或者原型图进行需求分析&#xff0c;为产品的功能设计和优化提供建议。 而使用ChatGPT可以很好地帮助分析和整理用户需求。 实践演练 接下来&#xff0c;需要使用ChatGPT 辅助我们完成需求分析的任务 注意&…

pgsql操作json类型

目录 一、表结构 二、实体类 三、json处理器 四、配置文件 五、josn数据 1、插入 2、查找 一、表结构 CREATE TABLE "public"."pg_user" ("id" int8 NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 MINVALUE 1 MAXVALUE 92233720…

肖sir__mysql之navicat安装__003

navicat 工具 一、navicat 介绍 &#xff1a;Navicat是一套可创建多个连接的数据库管理工具&#xff0c;用以方便管理 MySQL&#xff0c;创建、管理和维护数据库 二、navicat安装 1、安装包 2、查看navicat中安装包&#xff0c;并创建快捷方式 3、创建快捷键图标&#xff1a…

Vue3 学习-组件通讯(二)

文章目录 前言一、props通信二、自定义事件&#xff08;emit&#xff09;三、全局事件总线(EventBus)四、v-model五、userAttrs六、ref和$parent七、Provide与Inject八、pinia九、slot插槽总结 前言 本文主要记录Vue3的九种组件通信方式 一、props通信 子组件需要用defineProp…