Trie 字典树

news2024/11/7 15:30:13

Trie

Trie,又称字典树或前缀树。是一棵有根的多叉树。用于高效存储和查找字符串集合。

字典树从根到树上某一结点的路径就是一个字符串。

一棵字典树的构造过程图解:

img

字典树的度和字符集有关,英文字符集是26个字母,那么字典树的度就小于等于26。

字典树的每一个结点都要有一个标记,以表示该结点是否是一个字符串的终点。如上图,如果我们要查找 abc ,当查找到 c 结点的时候,由于 c 结点标记不是字符串的终点,那么就可以判断字典树内没有这个字符串。

标记可以是 bool isEnd 以表示这个结点是否是一个字符串的终点,也可以是 int cnt 以统计以该结点为终点的字符串的个数。

C++类封装的版本:

  • vector<Trie*> child 存储一个结点的26个孩子结点的指针。
  • cnt 表示以当前结点为终点的字符串的个数。
class Trie
{
private:
    vector<Trie*> child;
    int cnt;
public:
    Trie() :child(26), cnt(0) {}
    
    void insert(const string& s)
    {
        Trie* p = this;
        for (char c : s)
        {
            c -= 'a';
            if (p->child[c] == nullptr)
                p->child[c] = new Trie;
            p = p->child[c];
        }
        ++p->cnt;
    }

    int find(const string& s) const
    {
        const Trie* p = this;
        for (char c : s)
        {
            c -= 'a';
            if (p->child[c] == nullptr)
                return 0;
            p = p->child[c];
        }
        return p->cnt;
    }
};

C语言无封装,使用二维数组模拟的版本:

  • child[i][j] 表示编号为 i 的结点的 j 孩子的编号。i0 表示根结点,根结点为空结点, j 映射一个字符。
  • cnt[i] 表示以第 i 个结点为终点的字符串的个数。
  • idx 用来给结点编号。
const int N = 100010;

int child[N][26], cnt[N], idx;

void insert(char* str)
{
    int p = 0;
    for (int i = 0; str[i]; ++i)
    {
        int c = str[i] - 'a';
        if (!child[p][c]) child[p][c] = ++idx;
        p = child[p][c];
    }
    ++cnt[p];
}

int find(char* str)
{
    int p = 0;
    for (int i = 0; str[i]; ++i)
    {
        int c = str[i] - 'a';
        if (!child[p][c]) return 0;
        p = child[p][c];
    }
    return cnt[p];
}

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

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

相关文章

通用vue组件化登录页面

一、首页设置大体的样式布局 1.首先建立一个login文件夹&#xff0c;在里面建立对应的login.vue文件 2.设置登录页面的背景图&#xff0c;在App.vue文件中使用router-view进行展示登录组件 3.先给App.vue的div元素设置高度100%&#xff0c;之后在login.vue里面去设置背景图 …

财务管理系统|基于Springboot开发实现公司财务管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

知识库软件应该具备的7个基本功能

SaaS公司最大的业务挑战是&#xff1a;如何留住客户&#xff0c;客户与你达成合作关系后&#xff0c;如何让其与你继续合作&#xff0c;达成长期合作关系。对于SaaS产品&#xff0c;丢失客户的成本是很昂贵的&#xff0c;赢得一个新客户的成本是留住现有客户的5到25倍&#xff…

Vue脚手架的使用

一、通过命令行使用vue-cli的指令创建 1. 安装&#xff1a;npm i -g vue/cli-init 2. 创建Vue项目&#xff08;Vue2.0项目&#xff09;&#xff1a; ​ &#xff08;1&#xff09;创建文件夹&#xff1a;vue2-demo ​ &#xff08;2&#xff09;进入文件夹&#xff1a;cd v…

[Leetcode] 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。图示两个链表在节点 c1 开始相交&#xff1a;题目数据保证整个链式结构中不存在环。注意&#xff0c;函数返回结果后&#xf…

【 java 集合】Set 接口及常用实现类总结

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

JavaEE【Spring】:Spring事务和事务传播机制

文章目录前言一、Spring 中事务的实现1、MySQL 中的事务使用2、Spring 编程式事务&#xff08;了解&#xff09;3、Spring 声明式事务&#xff08;自动&#xff09;① Transactional 作用范围② Transactional 参数说明③ 注意事项Ⅰ. 抛出异常Ⅱ. 手动回滚④ Transactional ⼯…

2022年亚太地区大学生数学建模竞赛/2022年亚太杯1月加赛E题思路

问题1. 基本数据分析数据集中的OWID_WRL是什么&#xff1f;一般是指世界world。a) 哪些国家曾经拥有过核武器&#xff1f;现拥有核武器的国家有9个&#xff0c;分别为&#xff1a;美国、俄罗斯、英国、法国、中国、印度、巴基斯坦、以色列&#xff0c;朝鲜。曾经拥有核武的国家…

【python】导入同级、下级、上级目录中的模块

不想把代码都堆到一个文件里面&#xff0c;希望写的分层次&#xff0c;但又不是web框架&#xff0c;有入口文件和目录规则&#xff0c; 这个时候就要自己分包了&#xff0c;会遇到这个问题&#xff0c;明明ide智能追踪可以定位到包引用&#xff0c;但是却报错module undefine&a…

5G NR标准 第15章 上行功率和定时控制

第15章 上行功率和定时控制 上行链路功率控制和上行链路时序控制是本章的主题。 功率控制用于控制干扰&#xff0c;主要是针对其他小区的干扰&#xff0c;因为同一小区内的传输通常是正交的。 时序控制确保不同的设备以相同的时序接收&#xff0c;这是保持不同传输之间正交性…

Nacos设置为windows自启动服务

序言 众所周知&#xff0c;在 Windows 环境下想要启动 nacos 需要运行 bin 目录下的 startup.cmd。这样的启动方式需要保证 cmd 窗口一直开着&#xff0c;只要把这个窗口关掉&#xff0c;nacos 服务就停了。 所以为了避免人为的误关窗口&#xff0c;把 nacos 注册成一个 wins…

【可视化】无法理解PCA,条件概率,最小二乘回归?可视化帮你!

主成分分析PCA2D示例首先&#xff0c;只考虑两个维度的数据集&#xff0c;比如高度和重量。这个数据集可以绘制成平面上的点。但如果想要整理出变量&#xff0c;PCA会找到一个新的坐标系&#xff0c;其中每个点都有一个新的(x,y)值。坐标轴实际上没有任何物理意义。它们是高度和…

【JavaScript】如何转换blob数据与file文件还有url

大家好&#xff0c;关于blob对象和file对象有了解多少呢&#xff0c;它们都是一种文件的表示形式&#xff0c;文件之间是可以互相转换的&#xff0c;顺带一提&#xff0c;还有经常用到的临时文件路径tempFileURL。 文章目录文件类型Blob对象File对象URL临时路径文件类型 首先&…

c++ -- STL容器--vector

STL中最常用的容器为Vector&#xff0c;可以理解为数组#include <iostream> #include <vector> #include <algorithm> using namespace std;void myPrint(int val) {cout <<val<<endl; }//vector容器存放内置数据类型void test01() {//创建了一个…

数据库(tidb、clickhouse、hive)概念笔记

目录 1、有哪些分布式数据库 2、OLAP、OLTP、HTAP 3、TIDB、clickhouse、hive 一、TIDB 1. TiDb 核心特性&#xff1a; 2. TiDb 整体架构&#xff1a; 3.TiDB 存储&#xff1a; 二、clickhouse 三、hive 1.什么是 Hive&#xff1f; 2.Hive 架构和如何运作&#xff1…

KMP -- 代码求解next数组

代码求解next数组 1. KMP相关概念 前缀&#xff1a;包含首位字符但不包含末位字符后缀&#xff1a;包含末位字符但不包含首位字符next数字&#xff1a;主串与模式串不匹配时&#xff0c;模式串需要回退的位置next[j]&#xff1a;第 j 位字符前面的j-1位字符组成的字串的前后缀…

QGIS查看属性和选择要素

目录1. 查看属性和选择要素2. 调整图层样式&#xff0c;添加自动标注1. 查看属性和选择要素 #pic_center x400 暂时移除&#xff0c;不是删除&#xff0c;它还是存在它本来的位置&#xff0c;用的时候再次添加即可。 选择工具 点完工具后&#xff0c;点击图中一个点&#xf…

c++ -- STL容器--stack容器

5. stack容器5.1 简介① stack是一种先进后出的容器&#xff0c;它只有一个出口。② 栈中只有顶端的元素才可以被外界使用&#xff0c;因此栈不允许有遍历行为。③ 栈中进入数据称为&#xff1a;入栈 push④ 栈中弹出数据称为&#xff1a;出栈 pop5.2 常用接口① 功能描述&…

蓝桥杯STM32G431RBT6学习——GPIO

蓝桥杯STM32G431RBT6学习——GPIO GPIO外设分布 国信长天开发板使用的STM32G431RBT6为LQFP64的封装&#xff0c;可用的GPIO为49个&#xff0c;包括如下&#xff1a; PA0~PA15 PB0~PB15 PC0~PC15 PD2&#xff0c;PF0&#xff0c;PF1&#xff0c;PG10 其中PF0与PF1用于连接外部…

前端入门笔记 02 —— CSS

CSS标签通常要配合html或者js使用 CSS本身的构造 p{color : red}/*color 属性 red 值*//*p选择器 括号内内容 生命*/配合html <style>p{color : red}<\style>或者直接引入整个css文件 <head><style type text/css>import "1.3.css";<…