news 2026/7/22 10:56:12

力扣208-实现前缀树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 2:48:39

图片转PDF工具全攻略:从基础到专业方案

1. 图片转PDF工具需求背景解析在数字化办公场景中&#xff0c;将图片转换为PDF的需求正以每年37%的速度增长&#xff08;数据来源&#xff1a;2024年数字办公趋势报告&#xff09;。这种需求爆发主要源于三个现实场景&#xff1a;学生需要整理扫描版学习资料&#xff0c;商务人…

作者头像 李华
网站建设 2026/7/22 8:35:00

AI+Kuikly跨端开发实战:7.5小时构建多模态聊天应用

1. 项目背景与核心价值在移动互联网时代&#xff0c;跨平台开发一直是技术团队面临的重大挑战。传统模式下&#xff0c;一个功能需要在Android、iOS和鸿蒙三个平台上分别开发&#xff0c;不仅耗时耗力&#xff0c;还容易产生平台间的不一致性问题。Kuikly作为腾讯开源的跨端框架…

作者头像 李华
网站建设 2026/7/21 2:44:09

航空无线电设备两点标定与高K值外推技术解析

1. 项目背景与核心问题解析CAAC-ARPD D-8标准作为航空无线电设备检测的重要规范&#xff0c;其复现口径下的两点标定与高K值外推问题一直是业内调试的难点。这个看似专业的标题背后&#xff0c;实际上涉及无线电设备校准的核心方法论——如何在有限采样点的情况下&#xff0c;通…

作者头像 李华
网站建设 2026/7/21 2:43:21

Spring Boot实战:校园无人快递系统毕业设计全流程解析

最近在帮几个学弟学妹看毕业设计选题&#xff0c;发现一个挺有意思的现象&#xff1a;很多人一提到“毕业设计”就慌&#xff0c;总觉得要搞个颠覆性的、技术栈巨复杂的项目才能过关。结果往往是&#xff0c;要么选题太大无从下手&#xff0c;要么技术点太散&#xff0c;最后东…

作者头像 李华
网站建设 2026/7/21 2:43:05

微博热门内容聚合项目的技术实现与运营策略

1. 项目概述 "爱可可微博热门分享(10月13日)"是一个典型的社交媒体内容聚合项目&#xff0c;主要针对微博平台上的热门内容进行筛选、整理和分享。这类项目在信息爆炸时代尤为重要&#xff0c;能够帮助用户快速获取当日最值得关注的内容&#xff0c;避免信息过载。 …

作者头像 李华
网站建设 2026/7/21 2:42:41

国民级App Skill生态解析:从API到智能集成的技术演进与实践

如果你是一名开发者&#xff0c;最近可能已经注意到一个趋势&#xff1a;各大国民级App都在密集推出自己的"Skill"功能。从高德地图的Amap SDK Skills到微信小程序的各类API能力&#xff0c;Skill正在成为App生态中不可忽视的技术热点。但问题来了&#xff1a;这些Sk…

作者头像 李华