力扣hot100 实现Trie(前缀树) 字典树 一题双解

Problem: 208. 实现 Trie (前缀树)

文章目录

  • 思路
  • 复杂度
  • 💝 TrieNode版
  • 💝 二维数组版

思路

👩‍🏫 宫水三叶

在这里插入图片描述

复杂度

在这里插入图片描述

💝 TrieNode版

public class Trie
{class TrieNode{boolean end;//标记是否有以当前节点为结尾的字符串TrieNode[] ns = new TrieNode[26];}TrieNode root;public Trie(){root = new TrieNode();}public void insert(String word){TrieNode p = root;for (int i = 0; i < word.length(); i++){int u = word.charAt(i) - 'a';
//如果正在遍历的该字母在上一个节点的数组坐标中没有记录,就新建一个字母节点在字典树中if (p.ns[u] == null)//不存在此节点p.ns[u] = new TrieNode();//那就新建节点p = p.ns[u];//每一次生成字母都移动指针到下一个字母节点}p.end = true;// 以当前节点为结尾字符串的个数}public boolean search(String word){TrieNode p = root;for (int i = 0; i < word.length(); i++)//枚举所有字符{int u = word.charAt(i) - 'a';if (p.ns[u] == null)//只要有一个字符不存在就 falsereturn false;p = p.ns[u];}//最后还要看一下是否以当前字符串结尾//例:abcde 路径存在,查 abc,abc存在,但是没有以 c 为结尾的字符串,返回 falsereturn p.end;}public boolean startsWith(String prefix){TrieNode p = root;for (int i = 0; i < prefix.length(); i++){int u = prefix.charAt(i) - 'a';if (p.ns[u] == null)return false;p = p.ns[u];}//所有字符存在即可,前缀即存在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);*/

💝 二维数组版

//数组版
public class Trie
{int N = 100010;int[][] trie;int[] cnt;int idx = 1;public Trie(){
//		int[i][j] 表示 第 i 行中的 ('a'+j) 是否存在(默认为 0 表示不存在)trie = new int[N][26];cnt = new int[N];// cnt[i] 记录 格子 i 被标记为结尾的次数idx = 1;// 给用到的格子进行编号(从 0 开始避开默认状态)}public void insert(String word){int p = 0;for (int i = 0; i < word.length(); i++){int u = word.charAt(i) - 'a';if (trie[p][u] == 0)trie[p][u] = ++idx;p = trie[p][u];}cnt[p]++;}public boolean search(String word){int p = 0;for (int i = 0; i < word.length(); i++){int u = word.charAt(i) - 'a';if (trie[p][u] == 0)return false;p = trie[p][u];}return cnt[p] != 0;}public boolean startsWith(String prefix){int p = 0;for (int i = 0; i < prefix.length(); i++){int u = prefix.charAt(i) - 'a';if (trie[p][u] == 0)return false;p = trie[p][u];}return true;}
}

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

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

相关文章

【Origin绘图系列第4棒】桑基图

Origin绘制桑基图 桑基图&#xff08;Sankey diagram&#xff09;&#xff0c;即桑基能量分流图&#xff0c;也叫桑基能量平衡图。它是一种特定类型的流程图&#xff0c;右图中延伸的分支的宽度对应数据流量的大小&#xff0c;通常应用于能源、材料成分、金融等数据的可视化分…

Linux生成SSH公钥和密钥

目录 前言生成ssh keys使用公钥 前言 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于在不安全的网络上安全地进行远程访问和数据传输。它为用户提供了一种加密的通信方式&#xff0c;可以在客户端和服务器之间建立安全的连接。 SSH使用公钥加密技术…

阿里云幻兽帕鲁服务器创建和配置教程

如何自建幻兽帕鲁服务器&#xff1f;基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了&#xff0c;一看就懂系列。本文是利用OOS中幻兽帕鲁扩展程序来一键部署幻兽帕鲁服务器&#xff0c;阿里云百科aliyunbaike.com分享官方基于阿里云服务器快速创建幻兽帕鲁服务器教程&…

计算机网络-奈氏准则和香农定理(码间串扰 二者区别)

文章目录 失真失真的一种现象-码间串扰奈氏准则&#xff08;奈溃斯特定理&#xff09;例题 香农定理例题 奈氏和香农 失真 就是指与原来的不一样了 两种情况 前三个是正相关&#xff0c;最后一个是负相关 码元传输速率越快&#xff0c;失真程度越严重的原因可能包括以下几点…

Spring进阶

文章目录 一、Spring复习二、Spring进阶a.Bean作用域b.SpringBean的生命周期c.Spring中的bean是线程安全的吗?Servlet是线程安全的吗?d.Bean循环依赖e.Servlet的过滤器与Spring拦截器区别f. SpringBoot自动装配原理一、Spring复习 对spring的认识和理解: spring是一个轻量级…

stm32中的SPI

SPI的简介 文章目录 SPI的简介物理层协议层基本通讯过程起始和终止信号数据有效性CPOL/CPHA及通讯模式 STM3的SPI特性及架构通讯引脚时钟控制逻辑数据控制逻辑整体控制逻辑通讯过程 代码配置实现指令集结构体的定义SPI时钟信号的定义SPI端口定义SPI命令 flash驱动代码初始化代码…

Sublime的安装及汉化

sublime安装 官网sublime 点击Windows 下载参考&#xff1a;傻瓜式下载 sublime汉化 1&#xff09;安装 Sublime Text 4 成功后&#xff0c;点击菜单 【Tools】 -> 【Install Package Control】&#xff1b; 注意&#xff1a;安装包控件需要等待一会&#xff0c;点击可…

探索Go 语言URL:解析与构建

探索Go 语言URL&#xff1a;解析与构建 在 Go 语言中&#xff0c;解析和处理 URL 是日常开发中常见的任务之一。URL&#xff08;统一资源定位符&#xff09;是指定 Web 资源位置的标准方式&#xff0c;它由多个部分组成&#xff0c;包括协议、主机、路径、查询参数等。本文将深…

python使用回溯算法搜索单词

对于在字母表中搜索单词的问题,这是一个二维空间问题,可以利用深度优先搜索算法和回溯算法来满足探索与退回的执行过程。 给定一个字母表table以及一个单词word,试求在字母表中是否存在此单词,在字母表中可以任意位置为起点,每一步只能水平移动或者垂直移动,也就是只能在…

开发嵌入式Linux应用程序框架-QT的初步了解

嵌入式QT&#xff08;Qt for Embedded Linux&#xff09;是一个用于开发嵌入式Linux应用程序的跨平台软件开发框架。它提供了一套完整的开发工具&#xff0c;包括一个强大的应用程序框架、一个全面的窗口系统、一个事件驱动的图形库以及一套用于开发嵌入式设备的工具。 嵌入式Q…

Go(四)gin框架

一、初识gin 1.1、下载和安装gin 下载包&#xff1a;go get github.com/gin-gonic/gin 使用go mod管理包&#xff1a; 1&#xff09;初始化 Go Modules&#xff1a;go mod init your_module_name&#xff0c;这将创建一个 go.mod 文件&#xff0c;记录你的项目的模块信息和当前…

Linux shell 命令多行结果赋值给变量

文章目录 Linux shell 命令多行结果赋值给变量 Linux shell 命令多行结果赋值给变量 需求&#xff1a; ​ 假设有两个脚本 a.sh b.sh &#xff0c;当前需要在 b.sh 中输出 a.sh 的结果&#xff0c;在 b.sh 脚本中需要使用参数接收 a.sh 的结果&#xff0c;但是输出格式要和 a.s…

js数组/对象的深拷贝与浅拷贝

文章目录 一、js中的深拷贝和浅拷贝二、浅拷贝1、Object.assign()2、利用es6扩展运算符&#xff08;...&#xff09; 二、深拷贝1、JSON 序列化和反序列化2、js原生代码实现3、使用第三方库lodash等 四、总结 一、js中的深拷贝和浅拷贝 在JS中&#xff0c;深拷贝和浅拷贝是针对…

鸿蒙开发会是前端程序员的下一个春天吗?

前言 最近前端的大环境不太行&#xff0c;之前身处在前端的自己薪资也越来越无望了&#xff0c;隐隐约约感觉前端做不下去了&#xff0c;2024前端找不到工作要转行吗&#xff1f; 看新闻的过程中&#xff0c;**发现越来越多的巨头公司融入鸿蒙生态建设&#xff0c;鸿蒙“朋友…

【C++】入门

结束数据结构初阶的学习后&#xff0c;很高兴继续学习C&#xff0c;欢迎大家一起交流~ 目录 C关键字 命名空间 命名空间定义 命名空间使用 C输入&输出 缺省参数 缺省参数概念 缺省参数分类 函数重载 函数重载概念 C支持函数重载的原理--名字修饰 引用 引用概念…

【大根堆】【C++算法】871 最低加油次数

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 大根堆 优先队列 LeetCode:871最低加油次数 汽车从起点出发驶向目的地&#xff0c;该目的地位于出发位置东面 target 英里处。 沿途有加油站&#xff0c;用数组 stations 表示。其中 statio…

用4KB内存寻找重复元素(算法村第十五关青铜挑战)

在海量数据中&#xff0c;普通的数组、链表、Hash、树等等结构无效&#xff0c;因为内存空间不足。而常规的递归、排序&#xff0c;回溯、贪心和动态规划等思想也无效&#xff0c;因为执行超时。这类问题该如何下手呢&#xff1f;这里介绍三种非常典型的思路&#xff1a; 1.使…

如何在Vue项目中应用TypeScript?

文章目录 一、前言二、使用Componentcomputed、data、methodspropswatchemit 三 、总结 一、前言 与link类似 在VUE项目中应用typescript&#xff0c;我们需要引入一个库vue-property-decorator&#xff0c; 其是基于vue-class-component库而来&#xff0c;这个库vue官方推出…

Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms

报错 Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {typeUNKNOWN, servers[{addressmangodb-m.cc.com:3717, typeUNKNOWN, stateCONNECTING, exception{com.mongodb.MongoSocketReadE…

uniapp 使用echarts做折线图条形图。

提前10天把中烟活动做完了&#xff0c;以为能打酱油到除夕那天&#xff0c;结果又要做什么数据看板&#xff0c;方便烟草领导过年查看数据&#xff0c;还只给5天时间&#xff0c;真实压榨剥削啊&#xff0c;下辈子再也不‘拍黄片’了&#xff0c;不&#xff01;下份工作我就转前…