添加与搜索单词 - 数据结构设计[中等]

一、题目

请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。

实现词典类WordDictionary
1、ordDictionary()初始化词典对象
2、void addWord(word)word添加到数据结构中,之后可以对它进行匹配
3、bool search(word)如果数据结构中存在字符串与word匹配,则返回true;否则,返回falseword中可能包含一些 ‘.’ ,每个 . 都可以表示任何一个字母。

示例:
输入:["WordDictionary","addWord","addWord","addWord","search","search","search","search"]
[[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]]
输出:[null,null,null,null,false,true,true,true]

解释:

WordDictionary wordDictionary = new WordDictionary();
wordDictionary.addWord("bad");
wordDictionary.addWord("dad");
wordDictionary.addWord("mad");
wordDictionary.search("pad"); // 返回 False
wordDictionary.search("bad"); // 返回 True
wordDictionary.search(".ad"); // 返回 True
wordDictionary.search("b.."); // 返回 True

1 <= word.length <= 25
addWord中的word由小写英文字母组成
search中的 word 由 ‘.’ 或小写英文字母组成
最多调用104addWordsearch

二、代码

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

思路和算法: 根据题意,WordDictionary类需要支持添加单词和搜索单词的操作,可以使用字典树实现。对于添加单词,将单词添加到字典树中即可。

对于搜索单词,从字典树的根结点开始搜索。由于待搜索的单词可能包含点号,因此在搜索过程中需要考虑点号的处理。对于当前字符是字母和点号的情况,分别按照如下方式处理:
1、如果当前字符是字母,则判断当前字符对应的子结点是否存在,如果子结点存在则移动到子结点,继续搜索下一个字符,如果子结点不存在则说明单词不存在,返回false
2、如果当前字符是点号,由于点号可以表示任何字母,因此需要对当前结点的所有非空子结点继续搜索下一个字符。

重复上述步骤,直到返回false或搜索完给定单词的最后一个字符。如果搜索完给定的单词的最后一个字符,则当搜索到的最后一个结点的isEndtrue时,给定的单词存在。特别地,当搜索到点号时,只要存在一个非空子结点可以搜索到给定的单词,即返回true

class WordDictionary {private Trie root;public WordDictionary() {root = new Trie();}public void addWord(String word) {root.insert(word);}public boolean search(String word) {return dfs(word, 0, root);}private boolean dfs(String word, int index, Trie node) {if (index == word.length()) {return node.isEnd();}char ch = word.charAt(index);if (Character.isLetter(ch)) {int childIndex = ch - 'a';Trie child = node.getChildren()[childIndex];if (child != null && dfs(word, index + 1, child)) {return true;}} else {for (int i = 0; i < 26; i++) {Trie child = node.getChildren()[i];if (child != null && dfs(word, index + 1, child)) {return true;}}}return false;}
}class Trie {private Trie[] children;private boolean isEnd;public Trie() {children = new Trie[26];isEnd = false;}public void insert(String word) {Trie node = this;for (int i = 0; i < word.length(); i++) {char ch = word.charAt(i);int index = ch - 'a';if (node.children[index] == null) {node.children[index] = new Trie();}node = node.children[index];}node.isEnd = true;}public Trie[] getChildren() {return children;}public boolean isEnd() {return isEnd;}
}

时间复杂度: 初始化为O(1),添加单词为O(∣S∣),搜索单词为O(∣Σ∣∣S∣),其中∣S∣是每次添加或搜索的单词的长度,Σ是字符集,这道题中的字符集为全部小写英语字母,∣Σ∣=26。最坏情况下,待搜索的单词中的每个字符都是点号,则每个字符都有∣Σ∣种可能。
空间复杂度: O(∣T∣⋅∣Σ∣),其中∣T∣是所有添加的单词的长度之和,Σ是字符集,这道题中的字符集为全部小写英语字母,∣Σ∣=26

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

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

相关文章

对递归、循环和迭代的理解

递归、循环和迭代都是编程和算法中非常重要的知识&#xff0c;以下是本人对他们的理解&#xff0c;若有不对&#xff0c;还希望大家可以批评指正&#xff01; 递归&#xff1a;将一个大问题分解成多个相似的小问题&#xff0c;再将小问题分成更小的相似问题&#xff0c;然后逐个…

解密 Java ForEach 提前终止问题

目录 前言&#xff1a;场景复现分析与解决方案解决方案详解总结 前言&#xff1a; 你是否曾在使用 Java 8 的 forEach 迭代集合时遇到过提前终止循环的问题&#xff1f;在这篇博客中&#xff0c;我们将深入探讨这一问题&#xff0c;并提供多种解决方案。通过场景复现、分析源码…

Arduino驱动TMF8701 ToF激光测距传感器(距离传感器)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 <

TCP 三次握手:四次挥手

TCP 三次握手/四次挥手 TCP 在传输之前会进行三次沟通&#xff0c;一般称为“三次握手”&#xff0c;传完数据断开的时候要进行四次沟通&#xff0c;一般称为“四次挥手”。 数据包说明 源端口号&#xff08; 16 位&#xff09;&#xff1a;它&#xff08;连同源主机 IP 地址…

生成二维码,条形码,带数字,输出到文件

生成二维码和条形码 依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.google.zxing</groupId><a…

验证码服务使用指南

验证码服务使用指南 1 部署验证码服务 1.1 基础环境 Java 1.8 Maven3.3.9 1.2 安装Redis 参考“Redis安装指南” 1.3 部署验证码服务 1.3.1 下载源码 使用git从远程下载验证码服务代码(开源)。 1.3.2 使用idea打开项目 使用idea打开上一步下载的sailing目录&#xf…

优维产品最佳实践第20期:控制台全链路监控

之前我们会觉得cmdb自动发现没有上报很难排查&#xff0c;弄不清楚数据的上报链路&#xff1b;监控指标的数据断点很难定位&#xff0c;flink对现场来说是一个黑盒子&#xff1b;apm数据更新不及时到底是上报异常还是入库失败呢&#xff1f; 现在控制台集成了对数据链路的监控…

超声系统前端理论与模拟仿真-续

作者&#xff1a;蒋志强 本人同意他人对我的文章引用&#xff0c;但请在引用时注明出处&#xff0c;谢谢&#xff0e;作者&#xff1a;蒋志强 前言 近期整理了一下彩超前端及波束合成相关的内容&#xff0c;很早以前已经有过一次&#xff0c;这次把其它的内容总结一下&#xf…

【数据结构】什么是二叉树?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;二叉树的定义 &#x1f4cc;二叉树的特点 &#x1f4cc;特殊二叉树 &#x1f4cc;二叉树的性质 &#x1f4cc;二叉树的存储结构 &#x1f4cc;二叉树…

【Vue3+TypeScript】快速上手_代码

目录 001_写一个APP组件 002_一个简单的效果 003_setup概述 004_setup的返回值 005_setup与Options API的关系 006_setup语法糖 007_ref创建_基本类型的响应式数据 008_reactive创建_对象类型的响应式数据 009_ref创建_对象类型的响应式数据 010_ref对比reactive 01…

【golang】init()函数是什么时候执行的?

init() Go中的main()函数是程序执行的入口&#xff0c;main()函数执行完后&#xff0c;程序就等于结束了。Go中还有一个函数是在main()函数前执行&#xff0c;可以实现包级别的初始化操作–init()。 怎么执行的&#xff1f; Go程序初始化先于main函数&#xff0c;由runtime初…

(2023|CVPR,Corgi,偏移扩散,参数高斯分布,弥合差距)用于文本到图像生成的偏移扩散

Shifted Diffusion for Text-to-image Generation 公众&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 方法 2.1 偏移扩散 3. 实验 3.1 无监督文本到图像生成 3.2 无…

三相电机转差率为负值的情形

1.电机开始发电的特征 注意&#xff0c;电机因为有输入频率对原始旋转磁场的影响&#xff0c;在正常工作时&#xff0c;应该处于稳态&#xff0c;因为旋转磁场决定了这个系统的运转方向和运转的大致频率区间。它会处于力矩平衡态。但是&#xff0c;如果&#xff0c;此时电机处…

网络安全保障领域

计算机与信息系统安全---最主要领域 云计算安全 IaaS、PasS、SaaS(裸机&#xff0c;装好软件的电脑&#xff0c;装好应用的电脑) 存在风险&#xff1a;开源工具、优先访问权、管理权限、数据处、数据隔离、数据恢复、调查支持、长期发展风险 云计算安全关键技术&#xff1a;可信…

【深度解析C++之初始化列表】

系列文章目录 欢迎大家订阅我的《计算机底层原理》、《深度解析C》系列专栏、我会持续为大家输出优质文章&#xff0c;能够帮助到大家就是对我最大的鼓励&#xff01;&#x1f60a; 目录 系列文章目录 前言 一、什么是初始化列表 1.语法结构 2.为什么要使用初始化列表 1.…

LeetCode 2974. 最小数字游戏

你有一个下标从 0 开始、长度为 偶数 的整数数组 nums &#xff0c;同时还有一个空数组 arr 。Alice 和 Bob 决定玩一个游戏&#xff0c;游戏中每一轮 Alice 和 Bob 都会各自执行一次操作。游戏规则如下&#xff1a; 每一轮&#xff0c;Alice 先从 nums 中移除一个 最小 元素&…

Vue-Pinina基本教程

前言 官网地址&#xff1a;Pinia | The intuitive store for Vue.js (vuejs.org) 看以下内容&#xff0c;需要有vuex的基础&#xff0c;下面很多概念会直接省略&#xff0c;比如state、actions、getters用处含义等 1、什么是Pinina Pinia 是 Vue 的存储库&#xff0c;它允许您跨…

AI一叶知秋:从目标检测部署浅谈人工智能发展

笔者写这篇文章也有讨巧之嫌&#xff0c;仅以个人视角分享一些看法&#xff0c;主要从实践部署来谈谈近两年来计算机视觉模型的变化&#xff0c;不过AI是一个宏大的话题&#xff0c;每个人定义的人工智能就不一样&#xff0c;我们先来探讨一下何为人工智能。百度百科中是这样定…

〖Python网络爬虫实战㊹〗- JavaScript Hook 的用法

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

buuctf-Misc 题目解答分解97-99

97.[BSidesSF2019]zippy 下载完就是一个流量包 追踪tcp nc -l -p 4445 > flag.zip unzip -P supercomplexpassword flag.zip Archive: flag.zip 压缩包密码 supercomplexpassword 保存为 flag.zip 解压得到flag 98.[GUET-CTF2019]虚假的压缩包 先从虚假的压缩包入手 &am…