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

server/2024/10/18 18:29:12/

题目链接: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/server/5602.html

相关文章

运行python脚本下载官网安装包进行安装

背景介绍&#xff1a;1.由于公司业务人员window系统没有管理员用户权限&#xff0c;使用的是普通用户权限登陆的&#xff0c;因此不能自己安装软件。但是有时候涉及到软件的大批量更新&#xff0c;人工一个一个的去安装&#xff0c;效率太低&#xff0c;人工成本太高&#xff0…

【做一名健康的CSDNer】《脱单恋爱秘籍》 —— 让爱情不再是难题

在这个快节奏的数字时代&#xff0c;程序员们以其独特的智慧和专业技能&#xff0c;为世界带来了翻天覆地的变化。然而&#xff0c;当代码和逻辑成为日常&#xff0c;爱情和人际关系的编程似乎变得复杂起来。为了帮助程序员们在爱情的道路上也能取得成功&#xff0c;我们精心打…

Don‘t fly solo! 量化之路,AI伴飞

在投资界&#xff0c;巴菲特与查理.芒格的神仙友谊&#xff0c;是他们财富神话之外的另一段传奇。巴菲特曾这样评价芒格&#xff1a;他用思想的力量拓展了我的视野&#xff0c;让我以火箭的速度&#xff0c;从猩猩进化到人类。 人生何幸能得到一知己。如果没有这样的机缘&…

轻量级SQLite可视化工具Sqliteviz

什么是 Sqliteviz &#xff1f; Sqliteviz 是一个单页面离线优先的渐进式网络应用&#xff08;PWA&#xff09;&#xff0c;用于完全客户端的 SQLite 数据库或 CSV 文件的可视化。 所谓完全客户端&#xff0c;就是您的数据库永远不会离开您的计算机。使用 sqliteviz&#xff0c…

使用PHP开发体育赛事直播平台,有这些缺点和优点

"东莞梦幻网络科技"作为体育直播平台开发领域的领导者&#xff0c;选择使用PHP开发体育赛事直播平台的现成源码&#xff0c;为什么会选择该语言&#xff0c;背后的选择理由可以从该技术的优点和缺点中找到答案。 一、优点1、易学易用与快速开发&#xff1a;PHP语言语…

docker 安装 jenkins

docker 安装 jenkins 1.安装镜像 docker pull jenkins/jenkins 2.创建容器 docker run --detach \-u root \--publish 8850:8080 --publish 50000:50000 \--name jenkins \--restart always \--volume /usr/local/java/jdk-17.0.11:/usr/local/java/jdk-17.0.11 \--…

Linux 用户和组

理解Linux 用户和组的概念 掌握passwd 文件的组成以及作用 掌握shadow 文件的组成以及作用 了解group 文件的内容 1.用户分类&#xff1a; 超级管理员&#xff08;root&#xff09; 普通用户 程序用户 1.用户信息文件 /etc/passwd 文件中存储了所有用户信息。 1.passwd 格…

linux命令ar使用说明

ar 建立或修改备存文件&#xff0c;或是从备存文件中抽取文件 补充说明 ar命令 是一个建立或修改备存文件&#xff0c;或是从备存文件中抽取文件的工具&#xff0c;ar可让您集合许多文件&#xff0c;成为单一的备存文件。在备存文件中&#xff0c;所有成员文件皆保有原来的属…