Trie树【数组实现】

2023-11-05

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;
}

完结散花

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Trie树【数组实现】 的相关文章

随机推荐

  • 关于上采样方法总结(插值和深度学习)

    一 简介 上采样的技术是图像进行超分辨率的必要步骤 最近看到了CVPR2019有一些关于上采样的文章 所以想着把上采样的方法做一个简单的总结 看了一些文章后 发现上采样大致被总结成了三个类别 1 基于线性插值的上采样 2 基于深度学习的上采
  • 十大经典排序算法动画与解析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 排序算法是 数据结构与算法 中最基本的算法之一 排序算法可以分为内部排序和外部排序 内部排序是数据记录在内存中进行排序 而外部排序是因排序的数据很大 一次不能容纳全部的排序
  • python画图

    python画图 导入模块numpy 命名为np方便后续使用 import numpy as np numpy可进行数组和矩阵运算 提供大量的数学函数库 import matplotlib pyplot as plt matplotlib是
  • 无向图邻接表的深度优先遍历(DFS)

    邻接表是图的一种链式存储结构 对图的每个顶点建立一个单链表 n个顶点建立n个单链表 头文件 Graph h ifndef GRAPH H define GRAPH H define MAXSIZE 50 typedef char Verte
  • QT+PCL+VS制作点云显示界面(彩色显示xyz点云)

    前言 最近正学习QVTKWidget插件显示点云 参考博文 https blog csdn net wokaowokaowokao12345 article details 51078495 时发现其提供的官方编译样只能例打开XYZRGB的
  • python pip在哪个文件夹运行_python pip源配置,pip配置文件存放位置的方法

    pip源配置文件可以放置的位置 Linux Unix etc pip con pip pip conf 每一个我都找了都没有 所以我是在这个文件夹中创建的pip conf文件 config pip pip conf Mac OSX Libr
  • java自定义findbugs规则_findbugs自定义规则并配置实现检测

    findbugs不过多介绍了 对于这个主题找了一些资料 没有找到一个完整的介绍 要么是介绍怎么写detector 要么就是没有完整的介绍怎么配置生效 下面主要介绍一下怎么配置其生效 至于怎么写这个detector还是有很多资料说明的 不过在
  • 51单片机I/O口灌电流、拉电流、上拉电阻的联系

    一 灌电流 拉电流 我们可以通过编写程序直接控制单片机的I O口的电平是高还是低 但是却控制不了电流的大小 而电流又涉及到了驱动能力的问题 也就是说能不能带动你所加的负载 1 1什么是灌电流 拉电流 如图1 单片机 p1 0口 输出低电平时
  • Wireless Password 【HDU - 2825】【AC自动机+状压DP】

    题目链接 好题一道 推了一会 然后计算了一下时间复杂度 差不多最坏情况是25 100 1024 26 66560000然后看了下 嗯 能搞 有搞头哈哈哈 然后写了一下 首先 WA了 发现竟然是最大极限哪儿写错了 我的个天呐 A 我们看到最多
  • Hibernate 一对一关系(基于XML)

    场景 当一个实体跟另一个实体存在一对一关系时 就可以用hibernate的one to one mapping来处理啦 本教程将会讲解如何用hibernate来解决两个存在1对1关联关系的表之间的级联save问题 本教程用到的开发工具和技术
  • 2022年全网首发

    整篇文章约2 5万字 不包含引用和连接内容 回顾过去 2019 2020年 2021年 本文的行文思路 第一部分 学习路径概览 编程语言 Linux基础 数据库入门 计算机基础 Java基础 分布式理论篇 网络通信篇 离线计算篇 消息队列篇
  • Word2Vec和Doc2Vec模型

    NLP初级教程 刘建平博客 word2vec参数调整 及lda调参 Word2vec和Doc2vec原理理解并结合代码分析 基于gensim的Doc2Vec Word2Vec Word2Vec是Google在2013年开源的一款将词表征为实
  • Idea快捷键大全(Windows)

    一 知道类名查找类 1 Ctrl Shift Alt N 2 双击Shift 二 查找类中所有方法 Ctrl F12 三 快速查找类或方法在整个项目中的位置 按住Ctrl键再点击类或方法会出现所有用到过的文件对象
  • Map集合案例-统计投票人数

    需求 某个班级80名学生 现在需要组成秋游活动 班长提供了四个景点依次是 A B C D 每个学生只能选择一个景点 请统计出最终哪个景点想去的人数最多 利用Map集合进行统计 A06 HashMapDemo2 java package da
  • MySQL主从复制搭建步骤详解

    MySQL主从复制搭建步骤详解 1 简介 MySQL主从复制是一种数据库高可用性的解决方案 通过将数据从一个MySQL主服务器同步到一个或多个从服务器来提高数据库的可用性和性能 本文将详细介绍如何搭建MySQL主从复制环境 2 环境准备 在
  • linux下Nerdtree安装方法

    目录 1 下载Nerdtree 2 linux下安装 3 成功享受吧 1 下载Nerdtree 百度网盘下载 地址为链接 百度网盘 请输入提取码 提取码 07e3 来自百度网盘超级会员V4的分享 github方式下载 地址为 https g
  • 字符串 去掉空格 C++

    去掉空格 时间限制 1Sec 内存限制 128MB 提交 5807 解决 3117 题目描述 读入一些字符串 将其中的空格去掉 输入 输入为多行 每行为一个字符串 字符串只由字母 数字和空格组成 长度不超过80 输入以 End of fil
  • 【五、反向代理及其相关配置】

    文章目录 反向代理及其相关配置 1 反向代理 2 正向代理 3 网关 4 Nginx做反向代理的缺点 5 反向代理配置 1 跳转到外网网站上 2 跳转到本机服务器上 反向代理及其相关配置 1 反向代理 服务器提供的代理为反向代理 原理 当用
  • 网络安全(黑客)自学的误区

    一 自学网络安全学习的误区和陷阱 1 不要试图先成为一名程序员 以编程为基础的学习 再开始学习 我在之前的回答中 我都一再强调不要以编程为基础再开始学习网络安全 一般来说 学习编程不但学习周期长 而且实际向安全过渡后可用到的关键知识并不多
  • Trie树【数组实现】

    全文目录 Trie的表现形式 数组实现 Trie 树 代码 Trie的表现形式 Trie树主要用来实现字符串的存储和快速查找 其表现形式类似一颗多叉树 每个节点表示字符串的一个字符 由于可能会存在类似 abc 和 abcde 这样的数据 所