news 2026/4/23 11:31:07

LeetCode 面试经典 150_字典树_添加与搜索单词 - 数据结构设计(96_211_C++_中等)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 面试经典 150_字典树_添加与搜索单词 - 数据结构设计(96_211_C++_中等)

LeetCode 面试经典 150_字典树_添加与搜索单词 - 数据结构设计(96_211_C++_中等)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(字典树):
      • 代码实现
        • 代码实现(思路一(字典树)):

题目描述:

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

实现词典类 WordDictionary :

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

输入输出样例:

示例 1:
输入
[“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

题解:

解题思路:

思路一(字典树):

1、实现思路如下
插入单词

  • 从左到右插入这个单词的每个字母,若当前字母不存在字典树中(注意child是0~25,若child为nullptr则不存在),创建结点
  • 若为最后一个单词则进行标记isEnd=true。

查找单词
因单词中包含’.',所以我们要分两种情况讨论,从左到右查找这个单词的每个字符。

  • 若当前位置为字母,则查找node[word[i]-‘a’]存不存在,若存在则继续查找,若不存在则返回false
  • 若当前位置为’.',我们需要挨个判断此节点的所有儿子结点的分支。首先此节点的儿子结点不能为nullptr,其次递归的匹配其儿子结点,若匹配成功则返回true,否则返回false

需要非常注意一点字典树的 根结点 不存储任何信息。

2、复杂度分析:
① 时间复杂度:O(26k·L),假设在最坏情况下字典树的每个节点都有26个子节点,如果遇到 个 “.”,则为每个.都会进行 26 次递归。
② 空间复杂度:O(N×L),O(N×L),其中 N 是独立单词的数量,L 是单词的平均长度。

代码实现

代码实现(思路一(字典树)):
classWordDictionary{private:// 定义字典树的节点结构体(TrieNode)structTrieNode{vector<TrieNode*>child;// 子节点数组,表示26个字母的子节点boolisEnd;// 标记当前节点是否为某个单词的结束节点TrieNode():child(26,nullptr),isEnd(false){}// 构造函数,初始化子节点数组为26个nullptr,并将isEnd初始化为false};TrieNode*root;// 根节点// 插入单词的函数voidinsert(TrieNode*root,conststring&word){TrieNode*node=root;// 遍历单词中的每个字符for(autoc:word){// 计算字符对应的索引,并检查当前字符的子节点是否为空if(node->child[c-'a']==nullptr){// 如果为空,说明该字符路径还没有建立,创建新的节点node->child[c-'a']=newTrieNode();}// 将当前节点指向下一个字符的子节点node=node->child[c-'a'];}// 单词遍历完成后,将当前节点的isEnd标记为true,表示这是一个完整的单词node->isEnd=true;}// 搜索单词的深度优先搜索(DFS)函数booldfs(string&word,TrieNode*node,intindex){// 如果遍历到单词的末尾,返回当前节点是否为单词的结束节点if(index==word.size()){returnnode->isEnd;}// 如果当前字符是'.',可以匹配任意字符if(word[index]=='.'){// 遍历当前节点的所有子节点for(auto&child:node->child){// 对每个非空子节点递归进行DFSif(child!=nullptr&&dfs(word,child,index+1)){returntrue;// 如果某个子节点匹配成功,返回true}}returnfalse;// 如果所有子节点都无法匹配,返回false}else{// 如果当前字符不是'.',则检查当前节点对应字符的子节点是否为空if(node->child[word[index]-'a']==nullptr){returnfalse;// 如果没有对应的子节点,返回false}// 否则继续递归搜索下一个字符returndfs(word,node->child[word[index]-'a'],index+1);}}public:// 构造函数,初始化根节点WordDictionary(){root=newTrieNode();}// 添加一个单词到字典中voidaddWord(string word){insert(root,word);// 调用插入函数}// 搜索单词(支持'.'通配符)boolsearch(string word){returndfs(word,root,0);// 从根节点开始递归DFS}};

LeetCode 面试经典 150_字典树_添加与搜索单词 - 数据结构设计(96_211原题链接
欢迎大家和我沟通交流(✿◠‿◠)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:31:05

【源码解读之 Mybatis】【核心篇】-- 第10篇:动态SQL实现原理详解

第10篇&#xff1a;动态SQL实现原理详解 前言 在前面的章节中&#xff0c;我们学习了 MyBatis 的核心执行流程&#xff0c;特别是第9篇中详细介绍了 MappedStatement 和 SqlSource 的作用。你可能注意到&#xff0c;MyBatis 能够根据不同的条件动态生成 SQL&#xff0c;这正是 …

作者头像 李华
网站建设 2026/4/17 13:48:34

飞书文档批量导出终极指南:25分钟搞定700+文档的完整备份方案

飞书文档批量导出终极指南&#xff1a;25分钟搞定700文档的完整备份方案 【免费下载链接】feishu-doc-export 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 作为一名资深团队管理者&#xff0c;我曾经面临过最头疼的文档迁移问题——公司从飞书切换…

作者头像 李华
网站建设 2026/4/18 22:38:51

1小时打造你的DirectX修复工具原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速开发一个DirectX修复工具原型&#xff0c;核心功能&#xff1a;1.基本组件检测 2.常见dll修复 3.简易GUI界面 4.基础日志功能。使用PythonPyQt实现&#xff0c;要求2小时内可完…

作者头像 李华
网站建设 2026/4/21 22:18:00

用AI快速开发c#教程应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个c#教程应用&#xff0c;利用快马平台的AI辅助功能&#xff0c;展示智能代码生成和优化。点击项目生成按钮&#xff0c;等待项目生成完整后预览效果 作为一名刚接触C#的开发…

作者头像 李华
网站建设 2026/4/17 15:53:12

ViGEmBus虚拟手柄驱动终极配置完整指南

ViGEmBus虚拟手柄驱动终极配置完整指南 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus 想要在Windows系统中实现专业级的游戏控制体验吗&#xff1f;ViGEmBus虚拟手柄驱动为你打开了无限可能&#xff01;这款强大的内核级驱动程序能…

作者头像 李华
网站建设 2026/4/18 5:31:49

【Java毕设全套源码+文档】基于springboot的付费自习室管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华