【LeetCode-中等题】208. 实现 Trie (前缀树)

news2024/11/24 14:55:24

文章目录

    • 题目
    • 方法一:利用数组构建26叉树
    • 方法二:利用哈希表构建26叉树

题目

在这里插入图片描述

方法一:利用数组构建26叉树

插入图示:
在这里插入图片描述
全搜索和前缀搜索:
注意:全局匹配匹配完直接返回插入时的标志位
而前缀匹配时,匹配成功后直接返回true 因为不需要往下匹配了

匹配到空trie都统统直接返回false
在这里插入图片描述

// 方法一  : 利用数组存储孩子节点
    private Trie[] children ; //孩子数组  
    private boolean isWord ; //标志位

    public Trie() {//构造函数
        children = new Trie[26];// 初始化为大小为26的数组
        isWord = false;//标志位初始化为false
    }
    
   
   //插入操作
    public void insert(String word) {
      Trie root  = this;//给祖先节点赋空对象//此时 孩子数组为空  标志位默认false
      for(int i = 0 ; i<word.length() ; i++){//一个一个拆分字符串,将字符 - 'a' 转换为坐标
        char ch = word.charAt(i);
        int idx = ch - 'a';
        if(root.children[idx] == null){  //如果发现当前位置 为null  则是第一次插入,创建新的trie
          root.children[idx] = new Trie();
        }
        root = root.children[idx]; //如果当前位置存在,那么将指针指向下一层
      }
      root.isWord = true;  //插入完成  标记为true
    }
    //全匹配操作
    public boolean search(String word) {
      Trie root  = this;//获得当前对象
      for(int i = 0 ; i<word.length() ; i++){//一个一个拆分字符串,将字符 - 'a' 转换为坐标
        char ch = word.charAt(i);
        int idx = ch - 'a';
        if(root.children[idx] == null){  //如果发现当前位置 为null  说明搜索不到  直接return fasle
         return false;
        }
        root = root.children[idx]; //如果当前位置存在,那么将指针指向下一层继续搜索
      }
      return root.isWord;//如果能搜索到 则直接就是返回本来的状态值

    }
    // 前缀匹配
    public boolean startsWith(String prefix) {
      Trie root  = this;//获得当前对象
      for(int i = 0 ; i<prefix.length() ; i++){//一个一个拆分字符串,将字符 - 'a' 转换为坐标`在这里插入代码片`
        char ch = prefix.charAt(i);
        int idx = ch - 'a';
        if(root.children[idx] == null){  //如果发现当前位置 为null  说明搜索不到  直接return fasle
         return false;
        }
        root = root.children[idx]; //如果当前位置存在,那么将指针指向下一层继续搜索
      }
      return true;//如果能搜索到 则直接就是返回true
    }

方法二:利用哈希表构建26叉树

相比较上面的用数组构建26叉树,其实也可以采用哈希表存储子节点

在这里插入图片描述

方法二  : 利用hashmap存储孩子节点

    private Map<Character,Trie> children ; //孩子哈希表  key 为父节点  value为子trie节点  
    private boolean isWord ; //标志位

    public Trie() {//构造函数
        children = new HashMap<>();// 初始化哈希表
        isWord = false;//标志位初始化为false
    }
    
   
   //插入操作
    public void insert(String word) {
      Trie root  = this;//给祖先节点赋空对象
      for(int i = 0 ; i<word.length() ; i++){//一个一个拆分字符串,将字符 - 'a' 转换为坐标
        char ch = word.charAt(i);
        Trie node = root.children.get(ch);
       
        if(node == null){  //如果发现当前位置 为null  则是第一次插入,创建新的trie
          root.children.put(ch,new Trie());
        }
        root = root.children.get(ch); //如果当前位置存在,那么将指针指向下一层
      }
      root.isWord = true;  //插入完成  标记为true
    }
    //全匹配操作
    public boolean search(String word) {
      Trie root  = this;//获得当前对象
      for(int i = 0 ; i<word.length() ; i++){//一个一个拆分字符串,将字符 - 'a' 转换为坐标
        char ch = word.charAt(i);
        Trie node = root.children.get(ch);
        if(node == null){  //如果发现当前位置 为null  说明搜索不到  直接return fasle
         return false;
        }
        root = root.children.get(ch); //如果当前位置存在,那么将指针指向下一层继续搜索
      }
      return root.isWord;//如果能搜索到 则直接就是返回本来的状态值

    }
    // 前缀匹配
    public boolean startsWith(String prefix) {
      Trie root  = this;//获得当前对象
      for(int i = 0 ; i<prefix.length() ; i++){//一个一个拆分字符串,将字符 - 'a' 转换为坐标
       char ch = prefix.charAt(i);
        Trie node = root.children.get(ch);
        if(node == null){  //如果发现当前位置 为null  说明搜索不到  直接return fasle
         return false;
        }
       root = root.children.get(ch); //如果当前位置存在,那么将指针指向下一层继续搜索
      }
      return true;//如果能搜索到 则直接就是返回true
    }

参考:Leetcode 208 实现Trie(前缀树)

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

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

相关文章

Vagrant命令

文章目录 1.介绍2.下载3. 配置3.1 配置环境变量3.2 在xshell中连接使用 4. 相关命令4.1 Box相关4.2 初始化环境4.4 虚拟机相关 1.介绍 Vagrant 是一个虚拟机管理工具 2.下载 https://www.vagrantup.com/ 3. 配置 3.1 配置环境变量 测试安装是否成功 3.2 在xshell中连接使…

MybatisPlus插件功能详细介绍 自动分页 通用分页实体

本课程全面讲解了Mybatis框架的使用&#xff0c;从快速入门到原理分析再到实战应用。每一个知识点都有案例进行演示学习&#xff0c;最终通过学习你将全面掌握&#xff0c;从而使Mybatis的开发更加的高效&#xff0c;系统学习 通过项目的开发大家应该能发现&#xff0c;单表的C…

同是卫星,华为Mate 60 pro的天通卫星和北斗卫星有何区别?

作为一个海钓爱好者&#xff0c;在看到华为Mate 60 Pro带有卫星通话功能那一刻&#xff0c;我就知道&#xff0c;我的钱包要-7000了——因为卫星通话功能&#xff0c;对于我们这类有着小众爱好的人群来说&#xff0c;实在太需要了。 对比北斗卫星短消息&#xff0c;Mate 60 Pr…

[git] 如何克隆仓库,进行项目撰写,并绑定自己的远程仓库

摘要&#xff1a;删除.git文件&#xff0c;才可重新绑定远程仓库。 具体步骤&#xff1a; 文件夹右键&#xff0c;进入”Git Bash Here“执行命令 1. 执行 ”git clone 仓库地址“&#xff0c;克隆仓库 2. 在生成的仓库中&#xff0c;删除 .git 文件 3. git init 初始化仓库…

3D渲染:面法线和顶点法线

现在我们回顾了影响对象外观的参数&#xff08;它们的亮度、颜色等&#xff09;&#xff0c;我们准备开始研究一些简单的着色技术。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、法线 法线在着色中起着核心作用。 大家都知道&#xff0c;如果我们将物体朝向光源&a…

Unity ShaderGraph教程——进阶shader(水面、积雪,数字线框)

1.水面&#xff08;一&#xff09; 公式&#xff1a;场景深度 节点深度 — 屏幕空间位置的W向量 半透明物体与不透明物体的相交边缘 原理&#xff1a;场景深度 节点深度包含透明像素&#xff0c;屏幕空间w向量不包含透明像素。 注意&#xff1a;需要在UniversalRP-xxxQuali…

diskqueue怎么写入消息,怎么对外发送消息

nsq中diskqueue是nsq消息持久化的核心&#xff0c;内容较多&#xff0c;一共分为多篇 1. diskqueue是什么&#xff0c;为什么需要它&#xff0c;整体架构图&#xff0c;对外接口_YZF_Kevin的博客-CSDN博客 2. diskqueue的元数据文件&#xff0c;数据文件&#xff0c;启动入口…

成都睿趣科技:现在开一家抖音小店还来得及吗

随着社交媒体的迅猛发展&#xff0c;抖音已经成为了一个全球范围内广受欢迎的社交平台。在这个短视频应用上&#xff0c;人们分享着各种各样的内容&#xff0c;从搞笑段子到美食教程&#xff0c;再到时尚搭配和手工艺品制作。随着用户数量的不断增长&#xff0c;很多人都在思考…

Python第三方库 - matplotlib库

1 matplotlib了解 Matplotlib 可能是 Python 2D - 绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化&#xff0c;并且提供多样化的输出格式。这里将会探索 matplotlib 的常见用法。 2 matplotlib学习 2.1 引用 plt 表示当前子图&#xff0c;若没有就创建一个子图 …

x64dbg的安装

一、安装地址&#xff1a; 地址 解压目录 点击x96dbf.exe 二、使用 1.反汇编窗口 这个位置显示的是需要分析的程序的反汇编代码。在第一个区域的最左侧例如“7712EAA3”这一列就是内存地址区域&#xff0c;接着“E8 07”就是汇编指令的opcode&#xff0c;“jmp xxxxxxxxx”这…

天津Java培训机构 Java的发展空间如何?

在当今互联网时代&#xff0c;计算机技术的发展日新月异&#xff0c;越来越多人看到IT行业的广泛前景&#xff0c;纷纷想要转行成为一名程序员&#xff0c;作为一名IT从业人员&#xff0c;学习一门编程语言是必不可少的&#xff0c;而在众多编程语言中&#xff0c;Java无疑是较…

存储数据恢复- raid5多块硬盘出现坏道的数据恢复案例

存储数据恢复环境&#xff1a; 某单位一台存储&#xff0c;1个机头4个扩展柜&#xff0c;有两组分别由27块和23块硬盘组建的RAID5阵列。其中由27块磁盘组建的那一组RAID5阵列崩溃&#xff0c;这组RAID5阵列存放是Oracle数据库文件。存储系统上层共划分了11个卷。 存储故障&…

【工具】Linux下常用录屏软件

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

深圳企业宣传片怎么做

要拍摄企业宣传片&#xff0c;首先要搞清楚客户宣传片的目的和用途&#xff0c;然后根据自身情况拟定预算以及制作周期&#xff0c;再与甲方沟通具体需求&#xff0c;最后进入制作流程。整体制作流程可以分为以下步骤&#xff0c;由深圳企业宣传片制作公司老友记小编为您解答&a…

LeetCode--HOT100题(48)

目录 题目描述&#xff1a;437. 路径总和 III&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;437. 路径总和 III&#xff08;中等&#xff09; 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和…

Python数据分析实战-将字符串中的空格替换为逗号且要保留特定词组(附源码和实现效果)

实现功能 将字符串中的空格替换为逗号且要保留特定词组 实现代码 import restring "Linux Python Cloud Native Distributed System AI C Deep Learning Framework Micro Service Automation Git IoT"# 定义要保留的特定词组 special_phrases ["Deep Learn…

新手可以选黄金代理吗?

我们都知道选择现货黄金平台的时候&#xff0c;一定要选择一个正规的、合法的平台&#xff0c;这样投资者才可以安心进行交易&#xff0c;但是目前市面上我们看到很多的是黄金代理&#xff0c;而不是直接与现货黄金平台发生接触&#xff0c;那么&#xff0c;这种黄金代理在市场…

如何根据需求正确选择适合企业的CRM销售管理系统

现代企业的销售工作离不开使用各种各样的销售管理系统&#xff0c;随着互联网的发展&#xff0c;市面上出现了许多销售管理系统&#xff0c;那么销售管理系统哪种好呢&#xff1f;如何选择一款适合自己企业的CRM销售管理系呢&#xff1f;本文将从多个角度进行分析和比较为大家提…

nc前端合计行

nc前端合计行 1.无表体和单表体的合计行加法 只要卡片下 如果是只有表头要合计行就只留ShowTotalLine&#xff1b;如果是只有表体要合计行就只留ShowTotalLineTabcodes 2.多表体的合计行加法 表头卡片下和列表下都要 3.档案的合计行加法 重写一下列表模板

C++(18):异常处理

异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理。 异常使得能够将问题的检测与解决过程分离开来&#xff1a;程序的一部分负责检测问题的出现&#xff0c;然后解决该问题的任务传递给程序的另一部分。检测环节无须知道问题处理模块的…