【数据结构-字典树】力扣211. 添加与搜索单词 - 数据结构设计

server/2025/2/7 2:47:17/

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

实现词典类 WordDictionary :

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

示例:
输入:
[“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 由 ‘.’ 或小写英文字母组成
最多调用 104 次 addWord 和 search

字典树

class WordDictionary {
private:bool isEnd;vector<WordDictionary*> children;public:WordDictionary(): children(26, nullptr), isEnd(false) {}bool searchHelper(string& word, int index){WordDictionary* node = this;for(int i = index; i < word.size(); i++){char ch = word[i];if(ch == '.'){for(WordDictionary* child : node->children){if(child && child->searchHelper(word, i + 1)){return true;}}return false;}else{ch -= 'a';if(node->children[ch] == nullptr){return false;}node = node->children[ch];}}return node->isEnd;}void addWord(string word) {WordDictionary* node = this;for(char ch : word){ch -= 'a';if(node->children[ch] == nullptr){node->children[ch] = new WordDictionary();}node = node->children[ch];}node->isEnd = true;}bool search(string word) {return searchHelper(word, 0);}
};

这道题对比传统的字典树,在search的时候可能会遇到’.‘来代替任何一个字符。所以当遇到’.‘的时候,我们就遍历当前节点的所有children,也就是代表’.‘被当成了任意一个字符,然后开始遍历。要注意的是在递归的时候,需要调用child->searchHelper,这是因为child代表的是’.‘代替的字符,这样递归的时候node才能指向正确的位置,如果递归返回的是true,那么说明将’.‘替换成child字符是可行的,如果所有替换成任意child都不可行,那么返回false。当遍历的字符不是’.'点时候,就是正常字典树的search流程。


http://www.ppmy.cn/server/165569.html

相关文章

深度学习中,文本分类任务怎么做

一、处理流程 前置步骤&#xff1a; 标注数据得到数据集数据清理&#xff1a;将特殊字符、特殊格式、无效字符去除 正式步骤&#xff1a; 1、分词或分字&#xff1a;英文一般都分词&#xff0c;中文有分词也有分字。分词还是分字取决于你模型的embedding。 2、将字或词编辑ID…

深度学习 | 表示学习 | 卷积神经网络 | Batch Normalization 在 CNN 中的示例 | 20

如是我闻&#xff1a; 让我们来用一个具体的例子说明 Batch Normalization 在 CNN 里的计算过程&#xff0c;特别是如何对每个通道&#xff08;channel&#xff09;进行归一化。 1. 假设我们有一个 CNN 层的输出 假设某个 CNN 层的输出是一个 4D 张量&#xff0c;形状为&#…

Spring Boot统一异常拦截实践指南

Spring Boot统一异常拦截实践指南 一、为什么需要统一异常处理 在Web应用开发中&#xff0c;异常处理是保证系统健壮性和用户体验的重要环节。传统开发模式中常见的痛点包括&#xff1a; 异常处理逻辑分散在各个Controller中错误响应格式不统一敏感异常信息直接暴露给客户端…

Selenium 浏览器操作与使用技巧——详细解析(Java版)

目录 一、浏览器及窗口操作 二、键盘与鼠标操作 三、勾选复选框 四、多层框架/窗口定位 五、操作下拉框 六、上传文件操作 七、处理弹窗与 alert 八、处理动态元素 九、使用 Selenium 进行网站监控 前言 Selenium 是一款非常强大的 Web 自动化测试工具&#xff0c;能够…

SpringBoot使用 easy-captcha 实现验证码登录功能

文章目录 一、 环境准备1. 解决思路2. 接口文档3. redis下载 二、后端实现1. 引入依赖2. 添加配置3. 后端代码实现4. 前端代码实现 在前后端分离的项目中&#xff0c;登录功能是必不可少的。为了提高安全性&#xff0c;通常会加入验证码验证。 easy-captcha 是一个简单易用的验…

Java小白入门教程:LinkedList

目录 一、定义 二、作用 1、存储数据 2、动态扩容 3、提供方便的操作方法 三、使用场景 1.当你需要频繁地在列表的开头或结尾添加或删除元素时。 2.当你不需要按索引快速访问元素时&#xff0c;因为LinkedList访问元素需要从头开始遍历 3.当你不需要线程安全的数据结构…

Flink2支持提交StreamGraph到Flink集群

最近研究Flink源码的时候&#xff0c;发现Flink已经支持提交StreamGraph到集群了&#xff0c;替换掉了原来的提交JobGraph。 新增ExecutionPlan接口&#xff0c;将JobGraph和StreamGraph作为实现。 Flink集群Dispatcher也进行了修改&#xff0c;从JobGraph改成了接口Executio…

arm 下 多线程访问同一变量 ,使用原子操作 性能差问题

arm下原子操作性能差的原因 Linux Kernel(armv8-aarch64) 的原子操作的底层实现 - 极术社区 - 连接开发者与智能计算生态 arm 下如何解决 ARMs LSE (for atomics) and MySQL – MySQL On ARM – All you need to know about MySQL (and its variants) on ARM. arm 下lse 和…