【LeetCode热题100】【图论】实现 Trie (前缀树)

ops/2024/11/14 15:03:26/

题目链接:208. 实现 Trie (前缀树) - 力扣(LeetCode)

这应该和图论没啥关系,应该属于哈希和树,题目没讲前缀树到达是啥

前缀树是如何做到高效查找字符串的呢,先说单词查找树吧,一共就只有26个字母,先给节点结构

    struct Node {Node*next[26];};

这样存储字符串abc和abcd只会多一个d指向的节点,也就是相同的前缀会在相同的节点,每一个字母会有26种后缀,因此有26个指针指向后缀节点,如果某节点指针为空,说明没有该字母后缀

如果26个指针都为空,说明该节点是末尾节点,但是我们可以增加一个布尔变量标记是否是结尾,而不需要每次遍历判断26个指针

    struct Node {vector<Node*>next;bool end;Node():next(26,nullptr),end(false){}};

插入字符串的时候,从头到尾安排单词的每个字母,如果不存在当前字母,为它创建一个新的节点

Node *tree;void insert(string word) {Node *node = tree;for (char letter: word) {letter -= 'a';if (node->next[letter] == nullptr)node->next[letter] = new Node();node = node->next[letter];}node->end = true;}

为了判断是否是前缀和存在单词,可以写一个查找前缀的函数,如果前缀存在返回节点指针,代码基本和插入相同,不同的地方在于当不存在当前字母时说明没有该前缀,直接返回空

Node *isPrefix(string &prefix) {Node *node = tree;for (char letter: prefix) {letter -= 'a';if (node->next[letter] == nullptr)return nullptr;node = node->next[letter];}return node;}

那么查找前缀就直接调用看看结果是不是空的,查找单词就先看前缀结果是不是空,不是空看看是不是单词结尾

bool search(string word) {Node *result = isPrefix(word);return result != nullptr && result->end;}bool startsWith(string prefix) {return isPrefix(prefix) != nullptr;}

全部代码 

class Trie {struct Node {vector<Node *> next;bool end;Node(): next(26, nullptr), end(false) {}};Node *tree;public:Trie(): tree(new Node()) {}void insert(string word) {Node *node = tree;for (char letter: word) {letter -= 'a';if (node->next[letter] == nullptr)node->next[letter] = new Node();node = node->next[letter];}node->end = true;}Node *isPrefix(string &prefix) {Node *node = tree;for (char letter: prefix) {letter -= 'a';if (node->next[letter] == nullptr)return nullptr;node = node->next[letter];}return node;}bool search(string word) {Node *result = isPrefix(word);return result != nullptr && result->end;}bool startsWith(string prefix) {return isPrefix(prefix) != nullptr;}
};


http://www.ppmy.cn/ops/5806.html

相关文章

Docker Desktop 卡死在 “Starting the Docker Engine“问题解决

docker desktop启动卡死在这个界面长时间没有反应 wsl --status输入以上命令查看wsl状态&#xff0c;发现也是卡死的状态&#xff0c;长时间没有反应&#xff0c;猜测是因为WSL卡死导致的docker desktop卡死的 netsh winsock reset通过以上命令重置 重启电脑后问题解决

《量化投资以Python为工具》目录

《量化投资以Python为工具》 获取链接&#xff1a;《量化投资以Python为工具》 更多技术书籍&#xff1a;技术书籍分享&#xff0c;前端、后端、大数据、AI、人工智能... ​ ​ ​ ​

大数据:【学习笔记系列】Flink 中的 DataStream API 和 DataSet API

Apache Flink 提供了两种主要的数据处理API&#xff1a;DataStream API 和 DataSet API&#xff0c;这两种API分别针对不同的数据处理场景设计。以下是对这两种API的详细介绍&#xff1a; DataSet API 概述&#xff1a; DataSet API 是 Flink 的一个批处理API&#xff0c;用于…

一、pwn - 零基础ROP之Android ARM 32位篇(新修订,精华篇)

一、环境搭建 安装ndk r10e,必须得这个版本,其他版本可能导致 -fno-stack-protector 不生效! r10e Darwin: https://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zipLinux: https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_6…

CCIE-16-PIM

目录 实验条件网络拓朴实验环境实验目的 开始实验实验1&#xff1a;PIM-DM配置PIM域中的路由&#xff0c;开启PIM-DM组播路由功能&#xff0c;验证组播情况 实验2&#xff1a;PIM-SM&#xff08;静态RP&#xff09;配置PIM域中的路由&#xff0c;开启PIM-SM组播路由功能&#x…

Git ignore、exclude for TortoiseGit 小结

1.Ignore Type&#xff1a;忽略类型&#xff0c;也即忽略规则&#xff0c;如何去忽略文件? 1.1.Ignore item(s) only in containing folder(s)&#xff1a;仅忽略在包含在文件夹中项目。 仅忽略该文件夹下选定的patterns。the patterns其实就是文件类型&#xff0c;比如.txt后…

机器学习运用-信用卡交易诈骗预测

简介 本项目应用XGBoost算法对数据进行分析并建模预测信用卡交易是否具有欺骗性&#xff0c;属于机器学习相关的二分类任务。 XGboost XGBoost是一个优化的分布式梯度提升库&#xff0c;旨在实现高效、灵活和便携。XGBoost 不仅提供了一个强大的机器学习算法&#xff0c;也提…

【前端】用CSS实现div全屏铺满的方式

在网页设计和开发中&#xff0c;有时我们需要让一个div元素全屏铺满整个浏览器窗口&#xff0c;以实现更加吸引人的视觉效果或者更好地适配不同设备的屏幕大小。 最近遇到一个需求&#xff0c;需要将一个div自动铺满全屏&#xff0c;width会默认铺满&#xff0c;所以不用考虑&…