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

力扣面试150题--实现Trie(前缀树)

Day 67

题目描述

在这里插入图片描述

思路

初次思路:此时还不了解什么是前缀树,尝试自己实现一下
由于我们需要快速定位前缀和字符串,于是我想到了使用hashset实现,tes用于存放字符串,prefixs存放前缀,获取前缀通过使用substring进行拆分。

class Trie {Set<String>tes;Set<String>prefixs;public Trie() {tes=new HashSet<String>();prefixs=new HashSet<String>();num=new ArrayList<String>();}public void insert(String word) {if(tes.contains(word)){return;}else{tes.add(word);for(int i=0;i<=word.length();i++){String a=word.substring(0,i);prefixs.add(a);}}}public boolean search(String word) {return tes.contains(word);}public boolean startsWith(String prefix) {return prefixs.contains(prefix);}
}/*** 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);*/

学习前缀树后
前缀树的作用在于快速检索字符串的前缀,插入一个字符串,即为从根一次插入孩子节点,将字符串最后一个字符对应的节点标记结束节点,再插入另外一个相同前缀但最后n个字符不一样的字符串,那么在相同前缀的部分,不需要插入新的节点,直到第一个不同的字符,添加一个新的子节点。
这样做的好处,我们如果要获取两个字符串的前缀,只需要从根节点向下遍历,比较两个字符串,只要到某个节点出现了分支,则这个节点之前的节点就是两个字符的公共前缀。同时节约了存储空间
做法如下:

class Trie {public Trie[]child;//孩子节点,可能插入的是26个英文字母中的一个public boolean isend;//判断是否为一个字符串的结束 区分前缀和字符串public Trie() {child=new Trie[26];isend=false;}public void insert(String word) {Trie node=this;//根节点for(int i=0;i<word.length();i++){char a=word.charAt(i);int index=a-'a';//转化为序号if(node.child[index]==null){node.child[index]=new Trie();//创建为新孩子}node=node.child[index];//移动到下一个孩子}node.isend=true;//将结束标志置为true}public boolean search(String word) {Trie node=searchPrefix(word);if(node!=null&&node.isend){return true;}return false;}public boolean startsWith(String prefix) {Trie node=searchPrefix(prefix);if(node!=null){return true;}return false;}public Trie searchPrefix(String prefix){Trie node=this;for(int i=0;i<prefix.length();i++){char a=prefix.charAt(i);int index=a-'a';if(node.child[index]==null){//还没遍历完前缀就结束了 说明找不到return null;}node=node.child[index];}return node;}
}/*** 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.xdnf.cn/news/1019647.html

相关文章:

  • Git:现代开发的版本控制基石
  • Linux系统中自签名HTTPS证书
  • windows使用命令行查看进程信息
  • 高级定时器TIM1、TIM8
  • 什么是NIST CSF合规?ManageEngine卓豪合规指南!
  • 设备管理 -- Udev(二)U盘挂载
  • linux thermal framework(3)_thermal cooling device
  • WEBSOCKET研究
  • 传智健康---十天项目总结
  • 邮科OEM摄像头重塑楼宇安防价值链条
  • 010502管道符_防火墙出入站_不回显带外-渗透命令-基础入门-网络安全
  • 多模态大语言模型arxiv论文略读(120)
  • ArcPy 与 ArcGIS .NET SDK 读取 GDB 要素类坐标系失败?GDAL 外挂方案详解
  • 会计-收入-3-关于特定交易的会计处理
  • Flask应用中处理异步事件(后台线程+事件循环)的方法(2)
  • C# 使用HttpListener时候异常(此平台不支持此操作:System.PlatformNotSupportedException)
  • 论文阅读:arxiv 2025 Not All Tokens Are What You Need In Thinking
  • 一致性hash
  • PG、SprinBoot项目报错,表不存在
  • 代码训练LeetCode(34)文本左右对齐
  • 无人机避障——感知篇(Orin nx采用zed2双目相机进行Vins-Fusion-GPU定位,再通过位姿和深度图建图完成实时感知)
  • .NetCore 8 反射与源生成器(Reflection vs Source Generators)
  • 安装 Ubuntu Desktop 2504
  • Spring Boot自动配置原理与实践
  • 3.图数据Neo4j - CQL的使用
  • 6月13日day52打卡
  • docker-compose部署tidb服务
  • 二叉树的算法
  • 将包含父子关系的扁平列表 List<Demo> 转换成树形结构的 List<DemoVO>,每个节点包含自己的子节点列表
  • 年化收益237%的策略,12年年化是38%,支持配置最小日期,附aitrader_1.5代码发布