当前位置: 首页 > news >正文

力扣208-实现前缀树

208. 实现 Trie (前缀树) - 力扣(LeetCode)

Trie(发音类似 "try")或者说前缀树是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。

请你实现 Trie 类:

  • Trie()初始化前缀树对象。
  • void insert(String word)向前缀树中插入字符串word
  • boolean search(String word)如果字符串word在前缀树中,返回true(即,在检索之前已经插入);否则,返回false
  • boolean startsWith(String prefix)如果之前已经插入的字符串word的前缀之一为prefix,返回true;否则,返回false

示例:

输入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"**输出**[null, null, true, false, true, null, true]`

解释
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // 返回 True
trie.search("app"); // 返回 False
trie.startsWith("app"); // 返回 True
trie.insert("app");
trie.search("app"); // 返回 True

提示:

  • 1 <= word.length, prefix.length <= 2000
  • wordprefix仅由小写英文字母组成
  • insertsearchstartsWith调用次数总计不超过3 * 104

如果单词只有 a 和 b 两个字母,那么就变成了一个二叉树。假设 a 是左子节点,b 是右子节点(即 a 往左走,b 往右走)

insert : 假设插入 aabb,那么相当于新增一条“左、左、右、右”的二叉树路径,标记最后一个节点为终止节点。如果再插入 aabba,那么相当于一条“左、左、右、右、左”的二叉树路径,给刚刚的路径的终止节点新增一个左子节点,并标记这个左子节点为终止节点即可

search : 例如查找字符串 aabb,相当于在二叉树中查找是否存在一个“左、左、右、右”的路径且最后一个节点为终止节点

starswith : 相当于 search,只不过不需要“最后一个节点为终止节点”这么苛刻

现在是单词,也就是26个字母的排列组合,那么就从二叉树变成二十六叉树。26叉树的每个节点包含一个长为26的儿子节点列表,还有一个布尔变量 end 标记该节点是否为终止节点。

insert :

1.遍历 word,用 cur 表示当前字符在树的哪个节点,初始时 cur 为 root

2.如果word[i]不是 cur 的儿子,就创建一个节点 node 作为 cur 的儿子。如果word[i]为 a,那么 cur 的 son 数组中的son[0]就等于这个新创建的节点 node,后面的字符以此类推

3.更新 cur 为儿子列表中的相应节点

4.word 遍历完毕,将 cur 的 end 设置为 true

因为 startwith 和 search 的过程高度重叠,因此可以通用一个 find 函数:

1.遍历字符串 word,用变量 cur 表示当前字符在树的哪个节点,初始时 cur 为 root

2.如果word[i]不是 cur 的儿子,返回 0,search 和 startsWith 收到 0 之后返回 false

3.更新 cur 为儿子列表中的相应节点

4.遍历结束,如果 cur 的 end 是 false,返回 1,否则返回 2

5.search 如果收到的是 2,返回 true,否则返回 false

6.startsWith 如果收到的是非 0 数字,返回 true,否则返回 false

class Trie: def __init__(self) : self.root = Node() def insert(self, word: str) -> None : cur = self.root # 表示当前遍历到的字符在树中的位置 for c in word : if c not in cur.son : cur.son[c] = Node() cur = cur.son[c] cur.end = True # 遍历完成,标记终止节点 def find(self, word : str) -> int : cur = self.root for c in word : if c not in cur.son : return 0 cur = cur.son[c] return 2 if cur.end else 1 # 如果遍历到最后发现最后一个字符刚好是终止节点,说明完全匹配,search 返回 true def search(self, word: str) -> bool : return self.find(word) == 2 def startsWith(self, prefix: str) -> bool : return self.find(prefix) != 0 class Node : __slots__ = 'son', 'end' def __init__(self) : self.son = {} self.end = False
http://www.jsqmd.com/news/1231940/

相关文章:

  • 斯诺克世锦赛:赵心童与墨菲的战术对决分析
  • 附近餐厅推荐实战:基于地理编码与Foursquare的轻量级数据方案
  • PLC项目实战:物料分拣系统全流程开发指南
  • Kuikly框架与AI辅助开发多模态聊天应用实战
  • 大模型API成本效率实测指南:从理论到工程落地
  • 腾讯混元大模型3.0技术解析与应用实践
  • Android注解开发:Support Annotations详解与实践
  • 进程终结者1.0一款电脑全系统均可使用的pc端进程管理工具
  • 图片压缩工具实战:精准控制文件大小与批量处理指南
  • 云燧ESL64-O超节点:OEX架构如何破解AI训练集群互联成本难题
  • 图片转PDF工具全攻略:从基础到专业方案
  • 粉丝群体自主性演化与管理策略
  • Claude Code 国内安装配置全攻略:从环境准备到实战应用
  • 视频翻译项目实战:从字幕提取到批量处理的完整流程指南
  • 开源AI视频编辑器:自然语言交互的技术突破
  • AI文档润色、PPT自动生成、会议纪要秒转——WPS AI这6大隐藏功能,90%用户从未启用,
  • ComfyUI与Z-Image-Turbo:高效AI图像生成方案
  • 2026年近期北京全包装修公司靠谱之选:苏技装饰全方位解析 - 品牌鉴赏官2026
  • 3个真实场景解析:如何让Android数据库性能提升300%的开源数据库框架
  • 航空无线电设备两点标定与高K值外推技术解析
  • 嵌入式开发12种调试实战:从日志到总线分析
  • 哈佛招生流程与平权法案解析
  • 古希腊艺术中的雕刻与绘画:技术与美学的完美融合
  • AI结对编程实战:重构开发者核心能力的三层协作流水线
  • Spring Boot集成RabbitMQ:消息队列实战指南
  • 欧米茄中国官方售后服务中心完整维修地址与热线实地考察报告+多信源验证(2026年7月更新) - 欧米茄服务中心
  • TMS320x2806x DSP I2C模块配置与FIFO中断优化实战指南
  • 2023年6月游戏市场新作盘点与性能优化指南
  • 2026年重庆搬家公司推荐榜:专业搬迁/精品打包/贴心服务全解析 - 甄选服务推荐
  • 2026年7月最新真力时佛山南海万达广场维修保养服务电话 - 亨得利钟表维修中心