数据结构笔记--前缀树的实现

news2024/11/25 16:22:53

1--前缀树的实现

        前缀树的每一个节点拥有三个成员变量,pass表示有多少个字符串经过该节点,end表示有多少个字符串以该节点结尾,nexts表示该字符串可以走向哪些节点;

#include <iostream>
#include <unordered_map>

struct TreeNode{
    TreeNode() : pass(0), end(0){}
    int pass; // 经过次数
    int end; // 是多少个字符串的结尾
    std::unordered_map<char, TreeNode*> nexts;
};

class Trie{
public:
    // 构造函数
    Trie(){root = new TreeNode();}

    void insert(std::string word){
        if(word.length() == 0) return;
        TreeNode *node = root;
        node->pass++;
        for(int i = 0; i < word.length(); i++){
            if(node->nexts[word[i]] == NULL){ // 哈希表中没有该字符
                node->nexts[word[i]] = new TreeNode(); // 新建该字符
            }
            node = node->nexts[word[i]];
            node->pass++; // 该字符节点经过的次数++
        }
        node->end++; // 遍历word末尾时,节点的end++,表明以该节点结尾的字符串数++
    }

    bool search(std::string word){
        if(word.length() == 0) return true;
        TreeNode *cur = root;
        for(int i = 0; i < word.length(); i++){
            if(cur->nexts[word[i]] == NULL) return 0; // 没有该字符节点
            cur = cur->nexts[word[i]];
        }
        return cur->end; // end不为0表明该字符串出现过
    }

    bool startWith(std::string prefix){
        if(prefix.length() == 0) return 0;
        TreeNode *cur = root;
        for(int i = 0; i < prefix.length(); i++){
            if(cur->nexts[prefix[i]] == NULL) return 0; // 前缀没出现过
            cur = cur->nexts[prefix[i]];
        }
        return cur->pass; // 有多少个字符串经过该前缀,0个表明false;
    }

private:
    TreeNode *root;
};

int main(int argc, char *argv[]){
    Trie T1;
    std::string test1 = "hello";
    T1.insert(test1);
    bool res1 = T1.search(test1);
    if(res1) std::cout << "true" << std::endl;
    else std::cout << "false" << std::endl;

    bool res2 = T1.startWith("hel");
    if(res2) std::cout << "true" << std::endl;
    else std::cout << "false" << std::endl;

    return 0;
}

2--LeetCode真题

2-1--实现Trie(前缀树)

         本题不能自定义节点,因此将 pass、end 和 nexts 等成员变量转换成类的成员变量,新节点就是类的对象;

class Trie{
public:
    // 构造函数
    Trie(){}

    void insert(std::string word){
        if(word.length() == 0) return;
        Trie *node = this;
        node->pass++;
        for(int i = 0; i < word.length(); i++){
            if(node->nexts[word[i]] == NULL){ // 哈希表中没有该字符
                node->nexts[word[i]] = new Trie(); // 新建该字符
            }
            node = node->nexts[word[i]];
            node->pass++; // 该字符节点经过的次数++
        }
        node->end++; // 遍历word末尾时,节点的end++,表明以该节点结尾的字符串数++
    }

    bool search(std::string word){
        if(word.length() == 0) return true;
        Trie *cur = this;
        for(int i = 0; i < word.length(); i++){
            if(cur->nexts[word[i]] == NULL) return 0; // 没有该字符节点
            cur = cur->nexts[word[i]];
        }
        return cur->end; // end不为0表明该字符串出现过
    }

    bool startsWith(std::string prefix){
        if(prefix.length() == 0) return 0;
        Trie *cur = this;
        for(int i = 0; i < prefix.length(); i++){
            if(cur->nexts[prefix[i]] == NULL) return 0; // 前缀没出现过
            cur = cur->nexts[prefix[i]];
        }
        return cur->pass; // 有多少个字符串经过该前缀,0个表明false;
    }

private:
    int pass = 0; // 经过次数
    int end = 0; // 是多少个字符串的结尾
    std::unordered_map<char, Trie*> nexts;
};

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

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

相关文章

【Sklearn】基于支持向量机算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于支持向量机算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理1.1 数学模型1.2 模型原理 2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&…

【从零学习python 】20. Python列表操作技巧及实例

文章目录 列表推导式练习 列表的复制列表的copy方法copy模块的使用浅拷贝深拷贝 切片 进阶案例 列表推导式 所谓的列表推导式&#xff0c;就是指的轻量级循环创建列表 基本的方式 在循环的过程中使用if 2个for循环 3个for循环 练习 请写出一段 Python 代码实现分组一…

WebDAV之π-Disk·派盘+Commander One

Commander one是一款为Mac用户设计的双窗格文件管理器,Commander One专业版在原先的版本功能拥有较大的提升。Commander One PRO可以帮助大家将文件从一个地方复制到另一个地方,支持多标签浏览、搜索、自定义热键设置、显示隐藏文件等功能。 π-Disk派盘 – 知识管理专家 派…

VLLM推理流程梳理

0x0. 前言 本文在对VLLM进行解析时只关注单卡情况&#xff0c;忽略基于ray做分布式推理的所有代码。 0x1. 运行流程梳理 先从使用VLLM调用opt-125M模型进行推理的脚本看起&#xff1a; from vllm import LLM, SamplingParams# Sample prompts. prompts ["Hello, my n…

Dedecms V110最新版RCE---Tricks

前言 刚发现Dedecms更新了发布版本&#xff0c;顺便测试一下之前的day有没有修复&#xff0c;突然想到了新的tricks去实现RCE。 文章发布的时候估计比较晚了&#xff0c;一直没时间写了。 利用 /uploads/dede/article_string_mix.php /uploads/dede/article_template_rand.…

ansible入门

ansible入门 一.ansible 背景介绍 Ansible 是一个广受欢迎的 IT 自动化系统。可以用来处理配置管理、应用自动化部署、云资源配给、网络 自动化和多借点部署等任务。其也可以使得复杂的变更如带负载均衡的零停机滚动更新更加容易。Ansible.com 1.1 自动化运维概念 1.1.1 运维…

AMEYA360:DNB1101大唐恩智浦工规级电池管理芯片

大唐恩智浦作为全球领先的半导体供应商&#xff0c;一直致力于为全球客户提供高质量的解决方案。在电池管理芯片领域&#xff0c;大唐恩智浦推出的DNB1101可谓是一款工规级的电池管理芯片&#xff0c;其卓越的性能和可靠性成为市场上备受全球领先的半导体供应商&#xff0c;一直…

背上大书包准备面试之CSS篇

目录 H5 新特性 css3新特性&#xff1f; 为什么要初始化css样式&#xff1f; 浏览器兼容性问题&#xff1f; css sprites&#xff08;css精灵图&#xff09;&#xff1f; css盒模型是什么样的&#xff1f; 页面中一个块元素的宽度包含了盒模型中的哪些部分&#xff1f;…

SpringBoot复习:(48)RedisAutoConfiguration自动配置类

RedisAutoConfiguration类代码如下&#xff1a; 可以看到在这个类中配置了2个bean: redisTemplate和stringRedisTemplate. 而它通过EnableConfigurationProperties(RedisProperties.class)注解&#xff0c;把配置文件中配置的Redis相关的信息引入进来了&#xff0c;RedisPrope…

EB配置------PORT(一)

今天学习了PortPinInputPullResistor 这个配置。 虽然它配置为输出后显示不可更改&#xff0c;但是它默认的配置依然有效。 该参数允许为所选端口引脚配置内部拉电阻[向上/向下]。 注意&#xff1a;此参数的默认值设置为相应SFR的重置值。 PORT_PIN_IN_NO_PULL&#xff1a;…

python 异步任务框架 Celery 入门,速看!

一、简介 Celery 是使用 python 编写的分布式任务调度框架。 它有几个主要的概念&#xff1a; celery 应用 用户编写的代码脚本&#xff0c;用来定义要执行的任务&#xff0c;然后通过 broker 将任务发送到消息队列中 broker 代理&#xff0c;通过消息队列在客户端和 worke…

Java有哪些应用领域?

Java是一种广泛使用的编程语言&#xff0c;它在全球范围内拥有数百万的开发者&#xff0c;Java既简单又强大&#xff0c;它可以用于开发各种类型的应用程序&#xff0c;从桌面应用程序到大型企业级系统。Java主要应用于金融、电商、嵌入式、大数据技术等领域。 1.金融行业。许多…

【校招VIP】产品深入分析之电商运营

考点介绍&#xff1a; 电商类产品运营分析是面试里经常遇到的问题&#xff0c;作为产品经理&#xff0c;需要对主流电商&#xff0c;比如淘宝、京东、拼多多等模式、打法有深入的理解。 在分析问题的时候&#xff0c;可以从场景&#xff08;如618&#xff09;、用户群体和模式、…

大专同事,7天开发了一套应用管理系统

目录 一、前言 二、如何基于工具实现应用开发&#xff1f; 三、低代码基本功能及操作 体验过程&#xff1a; 01、连接数据源 02、设计表单 03、流程设计 04、图表呈现 05、组织架构设置 五、效率评价 六、小结 一、前言 众所周知&#xff0c;每家公司在发展过程中都需要构建大量…

ChatGPT: 提升程序员开发效率的秘密武器!

引言 在现代软件开发中&#xff0c;时间和效率显得尤为重要。程序员们需要在尽可能短的时间内编写高质量的代码&#xff0c;并使之处于状态良好的维护周期。为满足这些需求&#xff0c;人工智能技术逐渐成为软件开发的一项核心能力。ChatGPT作为自然语言生成模型中的佼佼者&am…

uniapp开发微信小程序底部地区选择弹框

个人项目地址&#xff1a; SubTopH前端开发个人站 &#xff08;自己开发的前端功能和UI组件&#xff0c;一些有趣的小功能&#xff0c;感兴趣的伙伴可以访问&#xff0c;欢迎提出更好的想法&#xff0c;私信沟通&#xff0c;网站属于静态页面&#xff09; SubTopH前端开发个人站…

你选的产品真的适合做独立站吗?用这5种方法测试一下吧!

跨境电商行业圈里流行一句话“七分靠选品&#xff0c;三分靠运营”&#xff0c;一个独立站新手卖家要想在跨境电商这个庞大的行业体系里分得一块蛋糕&#xff0c;不深入了解一些选品的技巧恐怕很难做出成绩来。 很多独立站赚不到钱的原因在于选品上的失败&#xff0c;如果你的…

蓝绿灰度发布的介绍

背景介绍 蓝绿灰度发布 介绍 蓝绿部署中&#xff0c;一共有两套系统&#xff1a;一套是正在提供服务系统(也就是上面说的旧版)&#xff0c;标记为绿色&#xff1b;另一套是准备发布的系统&#xff0c;标记为蓝色。两套系统都是功能完善的&#xff0c;并且正在运行的系统&…

个微CRM管理系统,都有哪些功能?

微信CRM管理系统是一种优化整个公司的工作流程以改善客户管理的工具。 不仅可以提升微信CRM管理系统的创建&#xff0c;还可以提升现有客户的质量。 那么很多人就想问&#xff0c;微信CRM管理系统都有哪些功能呢&#xff1f; 1、多个微信号聚合聊天&#xff0c;解决微信来回…

通达信接口怎么调用?(通达信量化接口)准确吗?

通达信(DXFeed/TDX)接口是一个常用的股票行情数据接口&#xff0c;在中国股市数据分析和量化交易中应用广泛。下面我将介绍一种通达信接口的调用方式&#xff0c;但请注意&#xff0c;该方式可能存在变化和不准确之处&#xff0c;具体的调用方式还需参考官方文档或其他可靠来源…