LeetCode HOT 100 —— 208. 实现 Trie (前缀树)

news2024/12/25 10:21:01

题目

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树/单词查找树):是一种树形结构,利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

下图就是一个字典树:
在这里插入图片描述

字典树的数据结构:

class TrieNode {
	boolean isWord;								// 从root根节点至此是否是一个完整的单词(即这个节点是否是一个单词的结尾)
	TrieNode[] children = new TrieNode[26];		// 巧妙的用数组的下标作为26个字母;数组的值则为子节点

	public TrieNode(){}		// 打酱油的无参构造函数(不写也行)
}

isWordtrue的节点就是上面的图中红色的节点。举个例子,两个字符串"cat""catch",字符 t 和字符 h 对应的节点,就是红色的

children[0] 对应小写字母 achildren[1] 对应小写字母 b,…,children[25]对应小写字母 z

插入字符串:
从根节点开始,对于当前字符串对应的子节点,有两种情况:

  • 子节点存在:沿着指针到子节点,继续处理下一个字符
  • 子节点不存在:创建一个新的子节点,记录在children数组的对应位置上,然后沿着指针移动到子节点,继续搜索下一个字符

查找前缀:
从根节点开始,对于当前字符串对应的子节点,有两种情况:

  • 子节点存在,沿着指针移动到子节点,继续搜索下一个字符。
  • 子节点不存在,说明字典树中不包含该前缀,返回空指针

重复以上步骤,直到返回空指针或搜索完前缀的最后一个字符

若搜索到了前缀的末尾,就说明字典树中存在该前缀。

此外,若前缀末尾对应节点的 isword 为真,则说明字典树中存在该字符串。

java代码如下:

class Trie{
	private Trie[] children;
	private boolean isWord;
	
	public Trie(){
		children = new Trie[26];
		isWord = false;
	}
	
	public void insert(String word){
		Trie node = this;//表示当前节点
		for(int i = 0; i < word.length(); i++){
			char ch = word.charAt(i);
			int index = ch - 'a';
			if(node.children[index] == null){
				node.children[index] = new Trie();
			}
			node = node.children[index];
		}
		node.isWord = true;
	}
		
	public boolean search(String word){
		Trie node = searchPrefix(word);
		return node != null && node.isWord;
	}

	public boolean startsWith(String prefix){
		return searchPrefix(prefix) != null;
	}
	
	private Trie searchPrefix(String prefix){
		Trie node = this;
		for(int i = 0; i < prefix.length(); i++){
			char ch = prefix.charAt(i);
			int index = ch - 'a';
			if(node.children[index] == null){
				return null;
			}
			node = node.children[index];
		}
		return node;
	}
}

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

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

相关文章

postgresql_internals学习笔记(二)常规vacuum

一、 作用与原理 page pruning执行速度很快&#xff0c;但它们的作用范围毕竟只有单页、且不包含索引&#xff0c;因此&#xff0c;我们还需要更有效的清理机制。 常规vacuum是最常用的一种&#xff0c;作用范围可以是整张表&#xff0c;清理过期元组及索引项&#xff0c;并且不…

PS图层+移动工具(1)图层概念-拖动操作-移动工具基础

先打开ps软件 然后点击进入工作区 选择右上角文件 点击打开 随便选一个要操作的图片 然后看一下自己工作区右侧的 这个图层工具开了没有 如果没开 点击上方 窗口 将图层选项勾选上 这里可以看到 我们打开一个完整图片 他就只有一个图层 触发你打开的是PSD格式的图片 psd是ps…

【云计算与大数据技术】云交付模型、云部署模型、云计算优势与挑战、应用的讲解(超详细必看)

一、云交付模型 云计算主要分为三种交付模型&#xff0c;而且这三种交付模型主要是从用户体验的角度出发的&#xff0c;分别是软件即服务&#xff08;SaaS&#xff09;&#xff0c;平台即服务&#xff08;PaaS&#xff09;&#xff0c;基础设施即服务&#xff08;IaaS&#xf…

数据库建表的 15 个最佳实践方式

前言 对于后端开发同学来说&#xff0c;访问数据库&#xff0c;是代码中必不可少的一个环节。 系统中收集到用户的核心数据&#xff0c;为了安全性&#xff0c;我们一般会存储到数据库&#xff0c;比如&#xff1a;mysql&#xff0c;oracle等。 后端开发的日常工作&#xff…

string的模拟实现

目录 ​一、模拟实现中类的组织 二、默认成员函数 1.默认构造函数 2.拷贝构造函数 &#xff08;1&#xff09;传统写法——循规蹈矩 &#xff08;2&#xff09;现代写法——偷天换日 3.析构函数 4.赋值运算符重载 二、元素访问 三、容量操作 1.容量与有效数据 2.改…

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

● Spring 官 方 Starter &#xff1a; 命 名 应 遵 循 spring-boot-starter-{name} 的 格 式 &#xff0c; 如 spring-boot-starter-web 作 为 SpringBoot Web模块的官方artifactId。 ● Spring 非 官 方 Starter &#xff1a; 命 名 应 遵 循 {name}-spring-bootstarter的格…

ModBus_RTU-上位机经RS485接口与PLC通信

目录&#xff1a; 一、预备知识 二、上位机经RS485接口与PLC通信 ---------------------------------------------------------------------------------------------------------------------- 一、预备知识 电力-ModBus_RTU通讯规约1 电力-ModBus_RTU通讯规约2 通信-R…

Java基于springboot+vue足球联赛管理系统

本足球联赛管理系统是针对目前足球联赛管理的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的足球联赛管理系统存在的问题进行分析&#xff0c;完善用户的使用体会。采用计算机系统来管理信息&#xff0c;取代人工管理模式&#xff0c;查询便利&#xff0c;信息准确率…

字符串处理【后缀数组】 - 原理2 后缀数组

字符串处理【后缀数组】 - 原理2 后缀数组 在字符串处理中&#xff0c;后缀树和后缀数组&#xff08;Suffix Array&#xff09;都是非常有力的工具。 后缀数组是后缀树的一个非常精巧的替代品&#xff0c;比后缀树容易实现&#xff0c;可以实现后缀树的很多功能&#xff0c;时…

Jenkins

目录 一、什么是Jenkins 二、为什么需要使用持续集成工具 三、如何搭建jenkins服务 四、jenkins集成服务器上的JDK 五、jenkins集成git 5.1 jenkins所在的服务安装git 5.2 jenkins集成git 5.3 jenkins创建一个任务项 5.4 创建远程仓库 5.5 执行任务 六、jenkins集成maven…

[附源码]Python计算机毕业设计SSM基于的校园商城(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

人工智能写代码 !ChatGPT VScode 插件 真正打败AI人工智能的只能是AI人工智能自己。

前言&#xff1a; 真正打败你的只能是你自己。 真正打败程序员的只能是程序员自己。 真正打败AI人工智能的只能是AI人工智能自己。 人工智能写代码 &#xff01;上线3天&#xff0c;下载4万&#xff0c;ChatGPT中文版VSCode插件来了,程序员要失业了吗&#xff1f; 还没开始就遇…

[附源码]JAVA毕业设计医院挂号系统(系统+LW)

[附源码]JAVA毕业设计医院挂号系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

VoIP通话-基于SIP协议的Asterisk(零)-Demo

文章首发及后续更新&#xff1a;https://mwhls.top/4116.html&#xff0c;无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评&#xff0c;非常感谢&#xff01; VoIP通话-基于SIP协议的Asterisk这篇为 Demo&#xff0c;是…

LabVIEW如何实现高性能串口助手-附代码

LabVIEW基本上还是在Windows系统下进行开发。在Windows下&#xff0c;提供了非常多的系统接口&#xff0c;供应用开发时调用来实现各种功能&#xff0c;在LabVIEW里面也是可以通过对这些系统接口进行封装&#xff0c;形成LabVIEW里面的控件&#xff0c;供LabVIEW程序开发时调用…

mongo实时导入到clickhouse案例(包含复杂嵌套json的解析)

(一)案例介绍 本案例是把Mongo数据库的数据通过FlinkCDC实时导入到Kafka&#xff0c;消费Kafka数据把维表数据写入到MySQL。读取MySQL维表数据和消费Kafka的数据通过Flink SQL Join后导入到ClickHouse。 (二) maven依赖 <?xml version"1.0" encoding"UTF-…

数字人的生死疲劳

你看好数字人吗&#xff1f;这个问题在今天似乎颇难回答。如果从宏观趋势上看&#xff0c;数字人的利好要素似乎已经达到了一个空前的高度。比如有市场分析机构预测&#xff0c;到2026年中国AI数字人的市场规模将突破100亿人民币&#xff0c;整体市场呈现高速增长态势。又比如今…

git基础之三|初始化本地库、新建文件、提交代码、版本回退、穿梭等使用命令集合【2022最全版】

Git作为版本管理的软件&#xff0c;在我们的协同工作中非常重要。因此&#xff0c;对于Git的常见命令&#xff0c;如新建、编辑文件、提交版本、版本回退等操作必须要熟悉。 Git常用命令一、初始化本地库1、创建项目文件夹2、右击选择Git bash3、在bash中输入4、查看创建的结果…

mysql索引中最左前缀原则

最左前缀原则 最先匹配最左边的索引&#xff0c;匹配上就继续&#xff0c;如果匹配不上就检索不到 (a,b,c是索引) where后面的条件有没有给a对应的条件 不给定a等于几&#xff0c;是没法儿查询出结果的&#xff0c; 因为辅助聚簇索引是把索引按照组合索引的顺序存到一起的&…

IoTDB 可实现的基本操作 —— 数据写入、删除、导出、元数据管理、时区设置 | 小白教程文档(四)...

前言上篇教程介绍了 Apache IoTDB 处理时序数据时&#xff0c;能够实现的部分具体功能和具体的操作命令&#xff0c;包括数据导入、基本查询、和聚合查询。本篇将继续介绍 Apache IoTDB 可实现的其他功能和相关 SQL 语句命令&#xff0c;包括数据的写入、删除、导出、元数据操作…