54.实现Trie(前缀树)

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
  • word 和 prefix 仅由小写英文字母组成
  • insert、search 和 startsWith 调用次数 总计 不超过 3 * 104

代码:

class Trie {//children表示前缀树的子节点private Trie[] children;//isEnd用于标记当前节点是否为字符串的最后一个节点private boolean isEnd; public Trie() {//初始时,每个前缀树都拥有26个子节点用于表示26个字母children = new Trie[26];//初始时,isEnd标记为falseisEnd = false;}public void insert(String word) {//定义一个node节点指向头节点Trie node = this;//遍历word字符串for(int i = 0;i<word.length();i++){//c表示字符串的第i个字符char c = word.charAt(i);//c - 'a'表示c字符对应的int值,用于将字符映射到整数int idx = c - 'a';//如果当前节点没有idx这个子节点,则创建该子节点if(node.children[idx] == null)node.children[idx] = new Trie();//将node指向当前新创建的子节点,继续遍历node = node.children[idx];}//将最后一个节点isEnd标记为true,表示该节点为字符串的最后一个节点node.isEnd = true;}public boolean search(String word) {//定义一个node节点指向头节点Trie node = this;//遍历word字符串for(int i = 0;i<word.length();i++){//c表示字符串的第i个字符char c = word.charAt(i);//c - 'a'表示c字符对应的int值,用于将字符映射到整数int idx = c - 'a';//如果当前节点没有idx这个子节点,直接返回false表示前缀树中不存在该字符串if(node.children[idx] == null)return false;//如果存在idx这个子节点,则将node指向该子节点,继续遍历node = node.children[idx];}//如果遍历到的最后一个节点isEnd为true表示该节点为字符串的最后一个节点,则说明前缀树中存在该字符串,直接返回true,否则返回falsereturn node.isEnd;}public boolean startsWith(String prefix) {//定义一个node节点指向头节点Trie node = this;//遍历prefix字符串for(int i = 0;i<prefix.length();i++){//c表示字符串的第i个字符char c = prefix.charAt(i);//c - 'a'表示c字符对应的int值,用于将字符映射到整数int idx = c - 'a';//如果当前节点没有idx这个子节点,直接返回false表示前缀树中不存在该前缀if(node.children[idx] == null)return false;//如果存在idx这个子节点,则将node指向该子节点,继续遍历node = node.children[idx];}//如果能遍历完prefix,说明存在该前缀return true;}
}/*** Your Trie object will be instantiated and called as such:* Trie obj = new Trie();* obj.insert(word);* boolean param_2 = obj.search(word);* boolean param_3 = obj.startsWith(prefix);*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/78913.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/78913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel文件批量处理指南 | 用VBA一键操作文件夹所有工作簿

系列文章 Excel跨文件夹批处理黑科技 | 用VBA递归遍历所有子目录 目录 系列文章&#x1f4c1; Excel文件批量处理指南 | 用VBA一键操作文件夹所有工作簿一、场景痛点与解决方案二、核心代码架构解析1. 文件遍历引擎2. 安全打开机制3. 错误处理框架 三、7大实战应用场景场景1&a…

南京大学OpenHarmony技术俱乐部正式揭牌 仓颉编程语言引领生态创新

2025年4月24日&#xff0c;由OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;项目群技术指导委员会与南京大学软件学院共同举办的“南京大学OpenHarmony技术俱乐部成立大会暨基础软件与生态应用论坛”在南京大学仙林校区召开。 大会聚焦国产自主编程语言…

C++回调函数学习

C回调函数学习 遇到问题&#xff0c;要学习C回调函数 遇到问题&#xff0c;要学习C回调函数 来吧&#xff0c;直接看代码吧 共有4种方法&#xff0c;每种方法都有标识&#xff0c;对用的屏蔽和打开就可以使用 原文在这里&#xff1a; #include<iostream> #include<f…

PDF解析新范式:Free2AI工具实测

在数字化浪潮中,PDF文件已成为企业、政府及个人存储与传递信息的核心载体。然而,PDF内容的提取与处理始终是行业痛点——无论是合同解析、研究报告整理,还是大规模知识库构建,传统方法常面临效率低、成本高、准确率不足等问题。Free2AI基于智能体技术与大模型算力,为PDF内…

【JS逆向基础】WEB自动化

前言&#xff1a;随着互联网的发展&#xff0c;前端技术也在不断变化&#xff0c;数据的加载方式也不再是单纯的服务端渲染了。现在你可以看到很多网站的数据可能都是通过接口的形式传输的&#xff0c;或者即使不是接口那也是一些 JSON 的数据&#xff0c;然后经过 JavaScript …

大型旋转机械信号趋势分析算法模块

大型旋转机械信号趋势分析算法模块&#xff0c;作为信号处理算法工具箱的主要功能模块&#xff0c;可应用于各类关键机械部件&#xff08;轴承、齿轮、转子等&#xff09;的信号分析、故障探测、趋势劣化评估等&#xff0c;采用全Python语言&#xff0c;以B/S模式&#xff0c;通…

01背包专题4:小A点菜

题目背景 uim 神犇拿到了 uoi 的 ra&#xff08;镭牌&#xff09;后&#xff0c;立刻拉着基友小 A 到了一家……餐馆&#xff0c;很低端的那种。 uim 指着墙上的价目表&#xff08;太低级了没有菜单&#xff09;&#xff0c;说&#xff1a;“随便点”。 题目描述 不过 uim …

探索SQLMesh中的Jinja宏:提升SQL查询的灵活性与复用性

在数据工程和数据分析领域&#xff0c;SQL是不可或缺的工具。随着项目复杂度的增加&#xff0c;如何高效地管理和复用SQL代码成为了一个重要课题。SQLMesh作为一款强大的工具&#xff0c;不仅支持标准的SQL语法&#xff0c;还引入了Jinja模板引擎的宏功能&#xff0c;极大地提升…

MySQL的深度分页如何优化?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL的深度分页如何优化?】面试题。希望对大家有帮助&#xff1b; MySQL的深度分页如何优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL的深度分页在处理大数据量时可能会导致性能瓶颈&#xff0c;特别是在…

SpringBoot3集成Mybatis

文章目录 基础使用代码1. 创建Spring Boot 3项目并添加依赖2. 配置数据库连接3. 创建实体类4. 创建Mapper接口5. 创建Service层6. 创建Controller层7. 主应用类 踩坑记录1. 依赖版本不兼容2. Mapper接口扫描问题3. 数据库连接问题4. Java版本问题 心得体会 基础使用代码 1. 创…

汽车加气站操作工考试知识点总结

汽车加气站操作工考试知识点总结 加气站基本知识 了解加气站类型&#xff08;CNG、LNG、LPG等&#xff09;及其特点。 熟悉加气站的主要设备&#xff0c;如储气瓶组、压缩机、加气机、卸气柱、安全阀等。 掌握加气站工艺流程&#xff0c;包括卸气、储气、加压、加气等环节。…

88、合并两个有序数组

题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;…

在ubuntu的docker上常用的docker命令

在 Ubuntu 系统上使用 Docker 时&#xff0c;以下是最常用的前 200 个 Docker 命令&#xff0c;并按类别进行分类。这些命令涵盖了 Docker 的基本操作、管理容器、镜像、网络、卷等方面的功能&#xff0c;适用于日常使用和高级管理任务。 1. 基本命令 这些是与 Docker 交互的基…

ICode国际青少年编程竞赛—Python—4级训练场—复杂嵌套循环

ICode国际青少年编程竞赛—Python—4级训练场—复杂嵌套循环 icode练习时遇到卡顿没有思路时怎么办&#xff0c;题目也很难找到不会的那道题&#xff5e;针对这个问题&#xff0c;我们开发了通过“步数”、“积木行数”来快速定位到你不会的题目&#xff5e; 题目会持续更新…

交替序列长度的最大值

1、题目描述 给出n个正整数&#xff0c;你可以随意从中挑选一些数字组成 一段序列S&#xff0c;该序列满足以下两个条件&#xff1a; 1.奇偶交替排列&#xff1a;例如&#xff1a;"奇&#xff0c;偶&#xff0c;奇&#xff0c;偶&#xff0c;奇.…" 或者 "偶&a…

电机试验平台:功能架构与关键技术介绍

电机试验平台作为电机研发、生产和质量控制的核心设备&#xff0c;其设计与应用直接关系到电机性能测试的准确性和效率。随着工业自动化、新能源汽车等领域的快速发展&#xff0c;对电机性能的要求日益提高&#xff0c;电机试验平台的设计也需不断优化以适应多样化需求。以下从…

ubuntu修改时区和设置24小时格式时间

ubuntu修改时区和设置24小时格式时间 一、修改时区二、设置24小时格式时间endl 一、修改时区 使用timedatectl命令更改当前时区为东八区[rootubuntu24-16:~]# timedatectl list-timezones | grep -i shanghai Asia/Shanghai [rootubuntu24-16:~]# timedatectl set-timezone As…

【IP101】图像分割技术全解析:从传统算法到深度学习的进阶之路

图像分割详解 ✂️ 欢迎来到图像处理的"手术室"&#xff01;在这里&#xff0c;我们将学习如何像外科医生一样精准地"切割"图像。让我们一起探索这个神奇的图像"手术"世界吧&#xff01;&#x1f3e5; 目录 &#x1f4d1; 1. 图像分割简介2. 阈…

URL混淆与权限绕过技术

一、漏洞原理 前后端路径解析逻辑不一致 后端框架&#xff08;Spring/Shiro&#xff09;自动处理特殊字符&#xff08;../、//&#xff09;&#xff0c;但鉴权组件&#xff08;如Filter&#xff09;未规范化原始URI。 示例&#xff1a;/system/login/../admin被Filter误判为白…

Redis卸载重装教程

卸载 找到redis安装目录 cmd打开该目录&#xff0c;输入 redis-server --service-uninstall运行结果如下 最后再删除redis文件夹即可&#xff08;如果显示该文件夹已在其他地方被打开而无法删除&#xff0c;可以重启一下电脑&#xff0c;就能正常删除啦&#xff09; 安装R…