Leetcode211. 添加与搜索单词 - 数据结构设计

Every day a Leetcode

题目来源:211. 添加与搜索单词 - 数据结构设计

解法1:字典树

字典树(前缀树)是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。前缀树可以用 O(∣S∣) 的时间复杂度完成如下操作,其中 ∣S∣ 是插入字符串或查询前缀的长度:

  • 向字典树中插入字符串 word;
  • 查询字符串 word 是否已经插入到字典树中。

根据题意,WordDictionary 类需要支持添加单词和搜索单词的操作,可以使用字典树实现。

对于添加单词,将单词添加到字典树中即可。

对于搜索单词,从字典树的根结点开始搜索。由于待搜索的单词可能包含点号,因此在搜索过程中需要考虑点号的处理。对于当前字符是字母和点号的情况,分别按照如下方式处理:

  • 如果当前字符是字母,则判断当前字符对应的子结点是否存在,如果子结点存在则移动到子结点,继续搜索下一个字符,如果子结点不存在则说明单词不存在,返回 false;

  • 如果当前字符是点号,由于点号可以表示任何字母,因此需要对当前结点的所有非空子结点继续搜索下一个字符。

重复上述步骤,直到返回 false 或搜索完给定单词的最后一个字符。

如果搜索完给定的单词的最后一个字符,则当搜索到的最后一个结点的 isEnd 为 true 时,给定的单词存在。

特别地,当搜索到点号时,只要存在一个非空子结点可以搜索到给定的单词,即返回 true 。

代码:

/** @lc app=leetcode.cn id=211 lang=cpp** [211] 添加与搜索单词 - 数据结构设计*/// @lc code=start
struct TrieNode
{vector<TrieNode *> child;bool isEnd;TrieNode() : child(vector<TrieNode *>(26, nullptr)), isEnd(false) {}
};void insert(TrieNode *root, const string &word)
{TrieNode *node = root;for (const char &c : word){if (node->child[c - 'a'] == nullptr)node->child[c - 'a'] = new TrieNode();node = node->child[c - 'a'];}node->isEnd = true;
}class WordDictionary
{
private:TrieNode *trie;public:WordDictionary() : trie(new TrieNode()) {}void addWord(string word){insert(trie, word);}bool search(string word){return dfs(word, 0, trie);}bool dfs(const string &word, int index, TrieNode *node){if (index == word.size())return node->isEnd;char ch = word[index];if (ch >= 'a' && ch <= 'z'){TrieNode *child = node->child[ch - 'a'];if (child != nullptr && dfs(word, index + 1, child))return true;}else if (ch == '.'){for (int i = 0; i < 26; i++){TrieNode *child = node->child[i];if (child != nullptr && dfs(word, index + 1, child))return true;}}return false;}
};/*** Your WordDictionary object will be instantiated and called as such:* WordDictionary* obj = new WordDictionary();* obj->addWord(word);* bool param_2 = obj->search(word);*/
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:初始化为 O(1),添加单词为 O(∣S∣),搜索单词为 O(∣Σ∣∣S∣),其中 ∣S∣ 是每次添加或搜索的单词的长度,Σ 是字符集,这道题中的字符集为全部小写英语字母,∣Σ∣=26。

空间复杂度:O(∣T∣⋅∣Σ∣),其中 ∣T∣ 是所有添加的单词的长度之和,Σ 是字符集,这道题中的字符集为全部小写英语字母,∣Σ∣=26。

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

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

相关文章

基于单片机温湿度光照自动窗帘系统设计

**单片机设计介绍&#xff0c; 基于单片机温湿度光照自动窗帘系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的温湿度光照自动窗帘系统是一种智能家居系统&#xff0c;通过使用单片机作为控制核心&#xff0c…

【IQR与MAD】原理,一文带你玩转箱型图含详细解释与代码

IQR方法 基于四分位数&#xff1a;使用数据的第一四分位数&#xff08;25%&#xff09;和第三四分位数&#xff08;75%&#xff09;来计算。 对称&#xff1a;相对于中位数对称地考虑上下界。 受极端值影响&#xff1a;如果数据中包含极端值&#xff0c;IQR可能会被拉得很大&a…

CMA认证是什么?CMA软件测试报告如何获取?

资格证书在各行各业都是一种专业性象征&#xff0c;如第三方检测机构的CMA认证&#xff0c;在相应的检测报告上加盖CMA章可获得国家以及行业认可&#xff0c;还是享受税收优惠的有力证明材料。 一、CMA认证是什么?   CMA是中国计量认证的简称&#xff0c;由省级以上人民政府…

顺序栈的基本操作(超详细)

目录 前言 一、顺序栈的定义 二、顺序栈的c语言结构描述表示 三、顺序栈中基本操作的实现 3.1顺序栈的初始化 3.2判断顺序栈是否为空 3.3求顺序栈的长度 3.4清空顺序栈 3.5销毁顺序栈 3.6顺序栈的入栈 3.7顺序栈的出栈 3.8求栈顶元素 3.9遍历顺序栈 四、顺序栈的…

JDK21发布了!面试官:来,谈下jdk21的新特性!

1.前言 JDK21 计划23年9月19日正式发布&#xff0c;尽管一直以来都是“版随意出&#xff0c;换 8 算我输”&#xff0c;但这么多年这么多版本的折腾&#xff0c;若是之前的 LTS 版本JDK17你还觉得不错&#xff0c;那 JDK21还是有必要关注一下&#xff0c;因为会有一批重要更新…

华清远见嵌入式学习——C++——作业一

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;int main() {string str;cout << "请输入一个字符串&#xff1a;" << endl;getline(cin,str);int dx0,xx0,sz0,kg0,qt0;int len str.size() 1;for(int i0;i<l…

HarmonyOS 传感器开发指南

HarmonyOS 系统传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的Sensor接口&#xff0c;可以查询设备上的传感器&#xff0c;订阅传感器数据&#xff0c;并根据传感器数据定制相应的算法开发各类应用&#xff0c;比如指南针、运动健康、游戏等。 运作…

Centos 如何判断分区是mbr还是gpt格式

1 介绍 MBR 自20世纪80年代初以来的标准分区表格式每个驱动器最多支持四个主分区最多可以划分2TB的磁盘 GPT GPT是MBR分区表格式的后续每个驱动器最多支持128个分区可以将一个磁盘分区到最大到18艾字节 对小于2TB的磁盘使用MBR对大于2TB的磁盘使用GTP 2 查询方式 2.1 fdis…

校园虚拟化部署与横向扩展统一存储

项目背景 这所隶属教育部直属重点大学&#xff0c;学校设有11个学科体系&#xff0c;现有本硕博学生共29000余人&#xff0c;为积极响应“中国教育现代化2023战略部署”&#xff0c;校方制定教育信息化2.0发展目标&#xff0c;通过平台融合&#xff0c;数据驱动、技术赋能等措…

Linux常见指令基础知识

目录 初始Linux操作系统 Linux背景&#xff1a; 开源 &#xff1a; 发行版本&#xff1a; ​编辑 OS概念&#xff0c;定位&#xff1a; 使用 XShell 远程登录 Linux Linux相关知识 文件是什么&#xff1f; 路径分隔符 &#xff08;.&#xff09; 和 &#xff08;. .&…

Docker Swarm总结+Jenkins安装配置与集成(5/5)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

反射、枚举以及lambda表达式

1. 反射 1.1 定义 java的.class文件在运行时会被编译为一个Class对象&#xff0c;既然是对象&#xff0c;那么我们就可以通过一定的方式取到这个对象&#xff0c;然后对于这个对象进行一系列操作&#xff08;改变原本类的属性、方法&#xff09;。 这个操作就是反射&#xf…

数据仓库建模下篇

在实际业务中&#xff0c;给了我们一堆数据&#xff0c;我们怎么拿这些数据进行数仓建设呢&#xff0c;数仓工具箱作者根据自身多年的实际业务经验&#xff0c;给我们总结了如下四步。 数仓工具箱中的维度建模四步走&#xff1a; 维度建模四步走 这四步是环环相扣&#xff0c…

JOSEF 可调漏电继电器 RT-L1KS φ25mm 导轨或面板安装

RT-L系列可调漏电继电器&#xff08;以下简称继电器&#xff09;适用于交流电压至690V&#xff0c;频率为50Hz&#xff0c;电流至1500A及以下漏电继电器中性点接地电路中。 RT-L系列可调型漏电继电器 RT-L1K可调型漏电继电器 RT-L2K可调型漏电继电器 RT-L3K可调型漏电继电器…

Mybaits-plus的使用

MybatisPlus特性 润物无声&#xff1a; 只做增强不做改变&#xff0c;引入它不会对现有工程产生改变&#xff0c;如丝般顺滑。 效率至上 只需简单配置&#xff0c;即可快速进行单表CRUD操作&#xff0c;从而节省大量时间。 使用MybatisPlus依赖基本步骤 引入MybatisPlus依…

echarts点击事件

有这么个需求要点击叶片的时候跳转页面 代码&#xff1a;点击之后 报错了 解决办法 1、使用箭头函数&#xff08;箭头函数没有自己的 this&#xff0c;所以在箭头函数中使用 this 时&#xff0c;其指向与外层作用域相同。&#xff09;或者使用闭包来解决上下文的问题。 2、使…

微信可以添加多少好友?

不知道有没有小伙伴好奇&#xff0c;微信到底可以添加多少好友&#xff1f;正好这个话题也上热搜了&#xff0c;我们就来了解一下。 有网友表示&#xff0c;自己的微信好友数量有10004个&#xff0c;已经不能再添加新的微信好友了。 一个微信号&#xff0c;可以添加的好友上限…

初识Linux(2).妈妈再也不用担心我Linux找不到门了。

文章目录 前言 1.man指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a; 2.cp指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a;把123.txt复制到a目录中类似window如下操作&#xff1a; 3.mv例如&#xff1a;类似window如下操作&#xff1a; 4.nano例…

算法效率的度量

算法效率的度量通常是通过时间复杂度和空间复杂度来描述的。 一、时间复杂度 算法中所有语句的执行次数之和为T(n)&#xff0c;它是算法问题规模n的函数&#xff0c;时间复杂度主要分析T(n)的数量级。 分类 1. 最好时间复杂度&#xff1a;最好情况下&#xff0c;算法的时间…

山西临县“5·7”火灾事故调查报告公布,揭秘富维烟火报警系统

近日&#xff0c;山西临县“57”火灾事故调查报告震惊全国&#xff0c;提醒我们火灾防控的重要性。在这起悲剧中&#xff0c;我们深刻认识到&#xff0c;及时发现火灾并迅速应对至关重要。这不仅是对生命安全的保护&#xff0c;也是对财产损失的有效减少。而在这方面&#xff0…