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

LeetCode 热题 100 208. 实现 Trie (前缀树)

LeetCode 热题 100 | 208. 实现 Trie (前缀树)

大家好!今天我们来解决一道经典的算法题——实现 Trie (前缀树)。Trie(发音类似 “try”)是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构在自动补全和拼写检查等场景中有广泛的应用。下面我将详细讲解解题思路,并附上Python代码实现。


一、问题描述

请你实现 Trie 类,支持以下操作:

  1. Trie():初始化前缀树对象。
  2. void insert(String word):向前缀树中插入字符串 word
  3. boolean search(String word):如果字符串 word 在前缀树中,返回 true;否则,返回 false
  4. 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

二、解题思路

核心思想

Trie 树是一种多叉树,每个节点表示一个字符。每个节点可以有多个子节点,每个子节点表示一个不同的字符。Trie 树的每个节点还包含一个标志位,用于标记该节点是否是一个单词的结尾。

实现步骤

  1. 定义 Trie 节点

    • 每个节点包含一个字典 children,用于存储子节点。
    • 每个节点包含一个布尔值 is_end,用于标记该节点是否是一个单词的结尾。
  2. 插入操作

    • 从根节点开始,逐个字符插入。
    • 如果当前字符不存在于当前节点的子节点中,则创建一个新的子节点。
    • 移动到下一个子节点,直到插入完所有字符。
    • 在最后一个字符的节点上标记 is_endTrue
  3. 搜索操作

    • 从根节点开始,逐个字符查找。
    • 如果当前字符不存在于当前节点的子节点中,返回 False
    • 移动到下一个子节点,直到查找完所有字符。
    • 检查最后一个字符的节点的 is_end 标志,如果为 True,返回 True;否则,返回 False
  4. 前缀查找操作

    • 从根节点开始,逐个字符查找。
    • 如果当前字符不存在于当前节点的子节点中,返回 False
    • 移动到下一个子节点,直到查找完所有字符。
    • 如果成功查找完所有字符,返回 True

代码实现

class TrieNode:def __init__(self):self.children = {}  # 存储子节点self.is_end = False  # 标记是否是一个单词的结尾class Trie:def __init__(self):self.root = TrieNode()  # 初始化根节点def insert(self, word: str) -> None:node = self.rootfor char in word:if char not in node.children:node.children[char] = TrieNode()node = node.children[char]node.is_end = True  # 标记单词结尾def search(self, word: str) -> bool:node = self.rootfor char in word:if char not in node.children:return Falsenode = node.children[char]return node.is_end  # 检查是否是单词结尾def startsWith(self, prefix: str) -> bool:node = self.rootfor char in prefix:if char not in node.children:return Falsenode = node.children[char]return True  # 前缀查找成功

代码解析

  1. 定义 Trie 节点

    • TrieNode 类包含一个字典 children 和一个布尔值 is_end
  2. 插入操作

    • 从根节点开始,逐个字符插入。
    • 如果当前字符不存在于当前节点的子节点中,则创建一个新的子节点。
    • 移动到下一个子节点,直到插入完所有字符。
    • 在最后一个字符的节点上标记 is_endTrue
  3. 搜索操作

    • 从根节点开始,逐个字符查找。
    • 如果当前字符不存在于当前节点的子节点中,返回 False
    • 移动到下一个子节点,直到查找完所有字符。
    • 检查最后一个字符的节点的 is_end 标志,如果为 True,返回 True;否则,返回 False
  4. 前缀查找操作

    • 从根节点开始,逐个字符查找。
    • 如果当前字符不存在于当前节点的子节点中,返回 False
    • 移动到下一个子节点,直到查找完所有字符。
    • 如果成功查找完所有字符,返回 True

复杂度分析

  • 时间复杂度

    • insert:O(m),其中 m 是单词的长度。
    • search:O(m),其中 m 是单词的长度。
    • startsWith:O(m),其中 m 是前缀的长度。
  • 空间复杂度

    • O(n * m),其中 n 是插入的单词数量,m 是单词的平均长度。

示例运行

示例1
# 创建 Trie 对象
trie = Trie()
# 执行操作
trie.insert("apple")
print(trie.search("apple"))   # 返回 True
print(trie.search("app"))     # 返回 False
print(trie.startsWith("app")) # 返回 True
trie.insert("app")
print(trie.search("app"))     # 返回 True

输出

True
False
True
True

总结

通过实现 Trie 树,我们可以在高效地存储和检索字符串数据集中的键。Trie 树在自动补全和拼写检查等场景中有广泛的应用。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!

相关文章:

LeetCode 热题 100 208. 实现 Trie (前缀树)

LeetCode 热题 100 | 208. 实现 Trie (前缀树) 大家好!今天我们来解决一道经典的算法题——实现 Trie (前缀树)。Trie(发音类似 “try”)是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构在自动补全和拼…...

python爬虫:RoboBrowser 的详细使用

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、RoboBrowser概述1.1 RoboBrowser 介绍1.2 安装 RoboBrowser1.3 与类似工具比较二、基本用法2.1 创建浏览器对象并访问网页2.2 查找元素2.3 填写和提交表单三、高级功能3.1 处理文件上传3.2 处理JavaScript重定向3.3…...

在日常管理服务器中如何防止SQL注入与XSS攻击?

在日常管理服务器时,防止SQL注入(Structured Query Language Injection)和XSS(Cross-Site Scripting)攻击是至关重要的,这些攻击可能会导致数据泄露、系统崩溃和信息泄露。以下是一份技术文章,介…...

Wkhtmltopdf使用

Wkhtmltopdf使用 1.windows本地使用2.golangwindows环境使用3.golangdocker容器中使用 1.windows本地使用 官网地址 https://wkhtmltopdf.org/,直接去里面下载自己想要的版本,这里以windows版本为例2.golangwindows环境使用 1.安装扩展go get -u githu…...

ArcGIS Pro 创建渔网格网过大,只有几个格网的解决方案

之前用ArcGIS Pro创建渔网的时候,发现创建出来格网过大,只有几个格网。 后来查阅资料,发现是坐标不对,导致设置格网大小时单位为度,而不是米,因此需要进行坐标系转换,网上有很多资料讲了ArcGIS …...

重学计算机网络之以太网

一:历史发展进程 DIX EtherNet V2 战胜IEEE802.3成为主流版本。总线型交换机拓扑机构代替集线器星型拓扑机构 1990年IEEE制定出星形以太网10BASE-T的标准**802.3i**。“10”代表10 Mbit/s 的数据率,BASE表示连接线上的信号是基带信号,T代表…...

《深度解构现代云原生微服务架构的七大支柱》

☁️《深度解构现代云原生微服务架构的七大支柱》 一线架构师实战总结,系统性拆解现代微服务架构中最核心的 7 大支柱模块,涵盖通信协议、容器编排、服务网格、弹性伸缩、安全治理、可观测性、CI/CD 等。文内附架构图、实操路径与真实案例,适…...

使用SCSS实现随机大小的方块在页面滚动

目录 一、scss中的插值语法 二、方块在界面上滚动的动画 一、scss中的插值语法 插值语法 #{}‌ 是一种动态注入变量或表达式到选择器、属性名、属性值等位置的机制 .类名:nth-child(n) 表示需同时满足为父元素的第n个元素且类名为给定条件 效果图&#xff1a; <div class…...

AI 眼镜新纪元:贴片式TF卡与 SOC 芯片的黄金组合破局智能穿戴

目录 一、SD NAND&#xff1a;智能眼镜的“记忆中枢”突破空间限制的存储革命性能与可靠性的双重保障 二、SOC芯片&#xff1a;AI眼镜的“智慧大脑”从性能到能效的全面跃升多模态交互的底层支撑 三、SD NANDSOC&#xff1a;11&#xff1e;2的协同效应数据流水线的高效协同成本…...

论文阅读(六)Open Set Video HOI detection from Action-centric Chain-of-Look Prompting

论文来源&#xff1a;ICCV&#xff08;2023&#xff09; 项目地址&#xff1a;https://github.com/southnx/ACoLP 1.研究背景与问题 开放集场景下的泛化性&#xff1a;传统 HOI 检测假设训练集包含所有测试类别&#xff0c;但现实中存在大量未见过的 HOI 类别&#xff08;如…...

算法学习--持续更新

算法 2025年5月24日 完成&#xff1a;快速排序、快速排序基数优化、尾递归优化 快排 public class QuickSort {public void sort(int[] nums, int left, int right) {if(left>right){return;}int partiton quickSort(nums,left,right);sort(nums,left,partiton-1);sort(nu…...

Postman 发送 SOAP 请求步骤 归档

0.来源 https://apifox.com/apiskills/sending-soap-requests-with-postman/?utm_sourceopr&utm_mediuma2bobzhang&utm_contentpostman 再加上自己一点实践经验 1. 创建一个新的POST请求 postman 创建一个post请求, 请求url 怎么来的可以看第三步 2. post请求设…...

Python Day39 学习(复习日志Day4)

复习Day4日志内容 浙大疏锦行 补充: 关于“类”和“类的实例”的通俗易懂的例子 补充&#xff1a;如何判断是用“众数”还是“中位数”填补空缺值&#xff1f; 今日复习了日志Day4的内容&#xff0c;感觉还是得在纸上写一写印象更深刻&#xff0c;接下来几日都采取“纸质化复…...

[Python] Python自动化:PyAutoGUI的基本操作

初次学习&#xff0c;如有错误还请指正 目录 PyAutoGUI介绍 PyAutoGUI安装 鼠标相关操作 鼠标移动 鼠标偏移 获取屏幕分辨率 获取鼠标位置 案例&#xff1a;实时获取鼠标位置 鼠标点击 左键单击 点击次数 多次有时间间隔的点击 右键/中键点击 移动时间 总结 鼠…...

课程介绍:《ReactNative基础与实战指南2025》

学习如何使用 ReactJS 构建适用于 iOS 和 Android 的 React Native 移动应用&#xff0c;无需 ReactJS 经验。无需掌握 Swift、Objective-C 或 Java/Android&#xff0c;也能开发跨平台&#xff08;iOS 和 Android&#xff09;移动应用。 全面掌握 React Native 的核心与进阶内…...

“候选对话链”(Candidate Dialogue Chain)概念

目录 一、定义与形式 二、生成过程详解 1. 语言模型生成&#xff08;LLM-Based Generation&#xff09; 2. 知识图谱支持&#xff08;KG-Augmented Generation&#xff09; 3. 策略调控&#xff08;Policy-Driven Planning&#xff09; 三、候选对话链的属性 四、候选对…...

应急响应靶机-web2-知攻善防实验室

题目&#xff1a; 前景需要&#xff1a;小李在某单位驻场值守&#xff0c;深夜12点&#xff0c;甲方已经回家了&#xff0c;小李刚偷偷摸鱼后&#xff0c;发现安全设备有告警&#xff0c;于是立刻停掉了机器开始排查。 这是他的服务器系统&#xff0c;请你找出以下内容&#…...

comfyui利用 SkyReels-V2直接生成长视频本地部署问题总结 1

在通过桌面版comfyUI 安装ComfyUI-WanVideoWrapper 进行SkyReels-V2 生成长视频的过程中&#xff0c;出现了&#xff0c;很多错误。 总结一下&#xff0c;让大家少走点弯路 下面是基于搜索结果的 ComfyUI 本地部署 SkyReels-V2 实现长视频生成的完整指南&#xff0c;涵盖环境配…...

UV 包管理工具:替代 pip 的现代化解决方案

安装 方法一&#xff1a;使用安装脚本 # macOS 和 Linux curl -LsSf https://astral.sh/uv/install.sh | sh# Windows PowerShell powershell -c "irm https://astral.sh/uv/install.ps1 | iex" 方法二&#xff1a;使用包管理器 # macOS (Homebrew) brew install uv#…...

css3 新增属性/滤镜效果/裁剪元素/图片适应盒子/定义和使用变量/恢复默认initial

从 CSS3 发布至今&#xff0c;CSS 标准引入了大量新特性&#xff0c;极大地丰富了前端开发的能力。以下是 CSS3 之后的重要新增属性、模块与特性总结&#xff0c;涵盖布局、动画、交互、视觉、选择器、单位等多个领域。 &#x1f3a8; 视觉与效果增强 属性/功能作用示例filte…...

YOLOv8 实战指南:如何实现视频区域内的目标统计与计数

文章目录 YOLOv8改进 | 进阶实战篇&#xff1a;利用YOLOv8进行视频划定区域目标统计计数1. 引言2. YOLOv8基础回顾2.1 YOLOv8架构概述2.2 YOLOv8的安装与基本使用 3. 视频划定区域目标统计的实现3.1 核心思路3.2 完整实现代码 4. 代码深度解析4.1 关键组件分析4.2 性能优化技巧…...

matlab实现VMD去噪、SVD去噪,源代码详解

为了更好的利用MATLAB自带的vmd、svd函数&#xff0c;本期作者将详细讲解一下MATLAB自带的这两个分解函数如何使用&#xff0c;以及如何画漂亮的模态分解图。 VMD函数用法详解 首先给出官方vmd函数的调用格式。 [imf,residual,info] vmd(x) 函数的输入&#xff1a; 这里的x是待…...

SQLite软件架构与实现源代码浅析

概述 SQLite 是一个用 C 语言编写的库&#xff0c;它成功打造出了一款小型、快速、独立、具备高可靠性且功能完备的 SQL 数据库引擎。本文档将为您简要介绍其架构、关键组件及其协同运作模式。 SQLite 显著特点之一是无服务器架构。不同于常规数据库&#xff0c;它并非以单独进…...

JAVA实战开源项目:精简博客系统 (Vue+SpringBoot) 附源码

本文项目编号 T 215 &#xff0c;文末自助获取源码 \color{red}{T215&#xff0c;文末自助获取源码} T215&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

Flink SQL 编程详解:从入门到实战难题与解决方案

Flink SQL 编程详解&#xff1a;从入门到实战难题与解决方案 Apache Flink 是当前流批一体实时计算的主流框架之一&#xff0c;而 Flink SQL 则为开发者提供了用 SQL 语言处理流式和批量数据的能力。本文将全面介绍 Flink SQL 的基础概念、编程流程、典型应用场景、常见难题及…...

GO+RabbitMQ+Gin+Gorm+docker 部署 demo

更多个人笔记见&#xff1a; github个人笔记仓库 gitee 个人笔记仓库 个人学习&#xff0c;学习过程中还会不断补充&#xff5e; &#xff08;后续会更新在github和 gitee上&#xff09; 文章目录 目录准备运行测试postman检查容器 链接&#xff1a;项目连接,完整项目代码仓库下…...

通过openpyxl在excel中插入散点图

实现代码 # -*- coding: utf-8 -*- """ Created on Sat May 31 23:30:12 2025author: anyone """from openpyxl import load_workbook from openpyxl.chart import ScatterChart, Reference, Series from openpyxl.chart.series import SeriesL…...

基于cornerstone3D的dicom影像浏览器 第二十五章 自定义VR调窗工具

文章目录 前言一、三维调窗原理二、自定义三维调窗工具三、调用流程1. 修改mprvr.js2. 修改DispalyerArea3D.vue3. view3d.vue4. Toolbar3D.vue 总结 前言 从cornerstoneTools BaseTool派生VolumeShiftColorTool&#xff0c;实现鼠标键按下并移动时&#xff0c;对3D窗口的pres…...

针对 Harmony-Cordova 性能优化,涵盖原生插件开发、线程管理和资源加载等关键场景

1. ‌原生图片处理插件&#xff08;Java&#xff09; package com.example.plugin; import ohos.media.image.ImageSource; import ohos.media.image.PixelMap; import ohos.app.Context; public class ImageProcessor { private final Context context; public ImagePro…...

【SCI论文实现】信息引导的高质量三维重建——系统架构设计 PYTHON

一、多模态数据采集与预处理模块 设计目标:解决动态场景中多源数据的时空对齐与质量优化问题,为后续特征提取提供高精度、强一致性的输入。 1.1 传感器配置逻辑 选择 RGB-D 相机(如 Kinect)与 LiDAR(如 Velodyne VLP-16)的互补组合,原因在于: RGB-D 相机提供高分辨率…...