LeetCode 热题 100 | 图论(三)

目录

1  前缀树

1.1  什么是前缀树

1.2  如何构建前缀树

2  208. 实现 Trie(前缀树)


菜鸟做题,语言是 C++

1  前缀树

1.1  什么是前缀树

前缀树,也被称作字典树(Trie)或者键树,是一种用于检索字符串数据集中的键的树形数据结构。在前缀树中,每一个节点都代表着一个字符,而路径则代表着字符串。这种数据结构特别适用于自动补全、拼写检查以及自然语言处理等场景。

1.2  如何构建前缀树

根据前缀树的定义,其节点的结构应该为:

class Trie {
private:
    vector<Trie *> children;
    bool isEnd;
}
  • 一个 Trie 节点表示一个字母
  • children 用于存储下一个字母的 26 种可能
  • isEnd 用于表示当前字母是否为某个单词的结尾

这里我们将前缀树定义为 Trie 类而不是 Trie 结构体,是因为它还将提供一些方法。

假设我们需要存储 appleapp 这两个单词,则可以构建如下 Trie:

① apple:由于此前还没有种树,因此我们需要创建 root 根节点。接着,因为第一个字母是 a,所以我们为根节点的 children[0] 创建子节点。第二个字母是 p,所以我们为子节点的 children[15] 创建子节点。以此类推。直到字母 e,我们只需要将它所对应的子节点的 isEnd 置为 True 即可。

② app:我们可以直接从 root 根节点开始查询。针对第一个字母 a,由于根节点的 children[0] 已经有子节点了,因此我们直接去找子节点。针对第二个字母 p,由于子节点的 children[15] 已经有子节点了,因此我们直接去找子节点。以此类推。直到最后一个字母 p,我们只需要将它所对应的子节点的 isEnd 置为 True 即可。

图中的 26 表示,children 容器中的每个节点(字母)都可以拥有自己的子节点(字母)。

2  208. 实现 Trie(前缀树)

① 初始化节点:

Trie() : children(26), isEnd(false) {}

② 插入新的字符串:

void insert(string word) {
    Trie * node = this;
    for (auto & ch : word) {
        ch -= 'a';
        if (node->children[ch] == nullptr)
            node->children[ch] = new Trie();
        node = node->children[ch];
    }
    node->isEnd = true;
}
    

this 指针指向的是当前的 Trie 对象,即第一个被创建的节点,也就是根节点。

③ 查询字符串:

bool search(string word) {
    Trie * node = this;
    for (auto & ch : word) {
        ch -= 'a';
        if (node->children[ch] == nullptr)
            return false;
        node = node->children[ch];
    }
    if (node->isEnd) return true;
    return false;
}

④ 查询字符串前缀:

bool startsWith(string prefix) {
    Trie * node = this;
    for (auto & ch : prefix) {
        ch -= 'a';
        if (node->children[ch] == nullptr)
            return false;
        node = node->children[ch];
    }
    return true;
}

和 “查询字符串” 几乎没有区别,只是不要求最后一个字母是某字符串的结尾。

class Trie {
private:
    vector<Trie *> children;
    bool isEnd;

public:
    Trie() : children(26), isEnd(false) {}
    
    void insert(string word) {
        Trie * node = this;
        for (auto & ch : word) {
            ch -= 'a';
            if (node->children[ch] == nullptr)
                node->children[ch] = new Trie();
            node = node->children[ch];
        }
        node->isEnd = true;
    }
    
    bool search(string word) {
        Trie * node = this;
        for (auto & ch : word) {
            ch -= 'a';
            if (node->children[ch] == nullptr)
                return false;
            node = node->children[ch];
        }
        if (node->isEnd) return true;
        return false;
    }
    
    bool startsWith(string prefix) {
        Trie * node = this;
        for (auto & ch : prefix) {
            ch -= 'a';
            if (node->children[ch] == nullptr)
                return false;
            node = node->children[ch];
        }
        return true;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mysql运维篇(七) 部署MHA--完结

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 一、MHA软件构成 Manager工具包主要包括以下几个工具&#xff1a; masterha_manger 启…

BY组态功能清单

演示地址 &#xff1a;http://www.byzt.net:60/sm/ 官网地址&#xff1a;http://www.hcy-soft.com BY组态是一款非常优秀的纯前端的【web组态插件工具】&#xff0c;可无缝嵌入到vue项目&#xff0c;react项目等&#xff0c;由于是原生js开发&#xff0c;对于前端的集成没有框架…

VUE3项目学习系列--项目创建(一)

一、项目搭建 1、环境要求&#xff1a;vite(node.js版本16) 构建项目&#xff0c;pnpm进行包管理&#xff0c;速度快、高效&#xff1b; 安装node.js&#xff0c;在node官方下载安装即可&#xff1b;pnpm安装&#xff0c;使用如下命令 npm i -g pnpm 2、项目创建&#xff1…

python学习笔记------元组

元组的定义 定义元组使用小括号&#xff0c;且使用逗号隔开各个数据&#xff0c;数据是不同的数据类型 定义元组字面量&#xff1a;(元素,元素,元素,......,元素) 例如&#xff1a;(1,"hello") 定义元组变量&#xff1a;变量名称(元素,元素,元素,......,元素)…

GitHub提交代码步骤

在个人主页找到setting: 在左侧最下面找到“开发者设置” 然后生成一个token&#xff1a; 全部勾上&#xff1a; 复制好token: 在本地仓库运行 git init 保所有的本地更改都已经提交。这包括新文件的添加以及现有文件的修改。 使用git status来查看当前有哪些更改是未跟踪或…

vue3 vite项目一运行就401(Unauthorized)

问题&#xff1a;项目一执行&#xff1a; pnpm run dev, 启动就出错&#xff0c; Failed to load resource: the server responded with a status of 401 (Unauthorized) 分析&#xff1a; 项目之前是正常运行的&#xff0c;没有问题&#xff0c;回溯刚刚改动&#xff0c;还原…

快速幂(求解原理+例题)

目录 反复平方法&#xff08;快速幂&#xff09;&#xff1a; 代码&#xff1a; 例题&#xff1a;快速幂求逆元 作用&#xff1a; 快速求出 的结果。 时间复杂度&#xff1a; O(logk) 如果使用一般做法&#xff0c;从1循环到k&#xff0c;时间复杂度是O(k) 反复平方法&am…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的行人车辆检测与计数(Python+PySide6界面+训练代码)

摘要&#xff1a;开发行人车辆检测与计数系统对于提升城市交通管理和监控系统的效率至关重要。本篇博客详细介绍了如何利用深度学习构建一个行人车辆检测与计数系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5…

8.WEB渗透测试-Linux基础知识-Linux基础操作(二)

内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;7.WEB渗透测试-Linux基础知识-Linux基础操作&#xff08;一&#xff09;-CSDN博客 Tab键是补全命令&#xff0c;双击两下Tab键&#xff0c;会告诉你能补全的所有命令 文本编辑器指令&#xff1a;vi 输入vi 1…

技术派Redis实现作者白名单

通过技术派发文章的时候&#xff0c;发文章会先通过审核&#xff0c;只有通过审核在会在网站上进行展示。是不是所有的作者都要经过审核呢&#xff1f; 当然不是&#xff0c;在这里做了一个白名单&#xff0c;在白名单中的用户发文之后是不需要进入审核的&#xff0c;可以直接…

终于找到你!数字化时代的秘密武器

在数字化时代&#xff0c;纸张依旧扮演着重要的角色&#xff0c;无论是平板的电子笔记背景纸张&#xff0c;还是纸质纸张&#xff0c;亦或者你想要一个美观的纸张背景图。一张合适的纸张能大大提升我们的工作和学习效率。今天&#xff0c;我们将探索三款网站&#xff0c;它们可…

libreoffice免费的office软件

https://mirrors.ustc.edu.cn/tdf/libreoffice/stable/24.2.1/win/x86_64/LibreOffice_24.2.1_Win_x86-64.msi

Jetson Xavier NX 开发板Ubuntu18.04 安装arduino IDE详细步骤

Jetson 平台是arch架构&#xff0c;官网上面几乎都是x86或者arm64的这两种错误版本都存在匹配问题无法使用&#xff0c;不要下载不要下载&#xff01; uname -a #版本查询1.正确下载打开方式 https://downloads.arduino.cc/arduino-1.8.19-linuxaarch64.tar.xz选择自己想要下…

Codeforces Round 930 (Div. 2)

substr时间复杂度O&#xff08;N&#xff09;&#xff0c;不能一遍遍找&#xff0c;会超时 #include<iostream> #include<algorithm> #include<vector> #include<map> using namespace std; const int N5e510; map<string,int>mp; vector<…

Vision Pro开发者学习路线

官方给到的Vision Pro开发者学习路线&#xff1a; 1. 学习基础知识&#xff1a; - 学习 Xcode、Swift 和 SwiftUI 的基础知识&#xff0c;包括语法、UI 设计等。 - 掌握 ARKit 和 SwiftUI 的使用&#xff0c;了解如何创建沉浸式增强现实体验。 2. 学习 3D 建模&#xf…

基于springboot+vue的网上服装商城

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

leetcode 热题 100_接雨水

题解一&#xff1a; 按列求&#xff1a;分别考虑每一列的雨水高度&#xff0c;某列的雨水高度只与其左侧最高墙和右侧最高墙有关&#xff0c;一种情况是该列比左右侧的墙都低&#xff0c;则根据木桶效应该列雨水高度为min(左侧墙高&#xff0c;右侧墙高)-列高&#xff0c;而其余…

Maven 学习与IDEA配置

(一) Maven 概述 [1]. 简介 Apache Maven 是一个项目管理和构建工具&#xff0c;它基于项目对象模型(POM)的概念&#xff0c;通过一小段描述信息来管理项目的构建、报告和文档 官网&#xff1a;http://maven.apache.org/ Maven是专门用于管理和构建Java项目的工具&#xff0…

算法43:动态规划专练(最长回文子串 力扣5题)---范围模型

之前写过一篇最长回文子序列的博客算法27&#xff1a;最长回文子序列长度&#xff08;力扣516题&#xff09;——样本模型 范围模型-CSDN博客 在那一篇博客中&#xff0c;回文是可以删除某些字符串组成的。比如&#xff1a; 字符串为&#xff1a;a1b3c4fdcdba&#xff0c; 那…

Typora旧版链接(Win+Mac+Linux版)

记得点赞本文&#xff01;&#xff01;&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1IckUvQUBzQkfHNHXla0zkA?pwd8888 提取码&#xff1a;8888 –来自百度网盘超级会员V7的分享