字符串匹配算法(三)Trie树算法

文章目录

  • Trie树的简介
    • Trie树定义
    • Trie树的实现
  • 代码实现

Trie树的简介

Trie树定义

  • Trid树,也叫”字典树“。它是一个树形结构。专门处理字符串匹配的数据结构,用来解决字符串集中快速查找某个字符串的问题。

  • Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。比如:有 6 个字符串,它们分别是:how,hi,her,hello,so,see,我们可以将这六个字符串组成下面的Trie树结构。
    在这里插入图片描述

  • 其中,根节点不包含任何信息。每个节点表示一个字符串中的字符,从根节点到红色节点的一条路径表
    示一个字符串(红色节点为叶子节点)

Trie树的实现

  • Trie 树是一个多叉树,我们通过一个下标与字符一一映射的数组,来存储子节点的指针。假设我们的字符串中只有从 a 到 z 这 26 个小写字母,我们在数组中下标为 0 的位置,存储指向子节点a 的指针,下标为 1 的位置存储指向子节点 b 的指针,以此类推,下标为 25 的位置,存储的是指向的子节点 z 的指针。如果某个字符的子节点不存在,我们就在对应的下标的位置存储 null。
    在这里插入图片描述

代码实现

package com.xxliao.algorithms.string_match.trie;/*** @author xxliao* @description: Trie树算法,用于从单词集合中找某个单词* @date 2024/5/31 18:15*/
public class TrieMatch {public static void main(String[] args) {TrieMatch trie=new TrieMatch();trie.insert("hello".toCharArray());trie.insert("her".toCharArray());trie.insert("hi".toCharArray());trie.insert("how".toCharArray());trie.insert("see".toCharArray());trie.insert("so".toCharArray());System.out.println(trie.find("how".toCharArray()));}// 定义根节点字符private TrieNode root = new TrieNode('/');/*** @description  往Trie树中添加字符串* @author  xxliao* @date  2024/5/31 18:21*/public void insert(char[] text) {// 定义当前节点TrieNode current = root;for(int i = 0; i < text.length; i++) {//求出字符的索引int index = text[i] -97;if(current.children[index] == null) {TrieNode newNode = new TrieNode(text[i]);current.children[index] = newNode;}current = current.children[index];}current.is_leaf_char = true;}/*** @description  在Trie树中查找字符串* @author  xxliao* @date  2024/5/31 18:25*/public boolean find(char[] pattern) {TrieNode current = root;for (int i = 0; i < pattern.length; i++) {int index = pattern[i] - 97;if (current.children[index] == null) {return false; // 不存在pattern}current = current.children[index];}if (current.is_leaf_char == false)return false; // 不能完全匹配,只是前缀return true; // 找到pattern}
}

演示结果:
在这里插入图片描述

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

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

相关文章

LeetCode503:下一个更大元素Ⅱ

题目描述 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&#xff0c;这…

记录一次云服务器无法连接的排查过程

运行环境&#xff1a;阿里云服务器 故障外显原因&#xff1a;登录失败,操作系统禁用了密码登录方式 控制台监控数据显示云盘读写BPS拉满了 因为之前问过线上售后&#xff0c;让安装了atop监控&#xff0c;&#xff0c;所以先打开atop日志&#xff1a; atop -r /var/log/atop…

自动驾驶中的长尾问题

自动驾驶中的长尾问题 定义 长尾问题&#xff08;Long-Tail Problem&#xff09;是指在数据分布中&#xff0c;大部分的数据集中在少数类别上&#xff0c;而剩下的大多数类别却只有少量的数据。这种数据分布不平衡的现象在许多实际应用中广泛存在&#xff0c;特别是在自动驾驶…

音视频开发—H265相关概念和压缩原理详解(GOP、宏块、帧内压缩、帧间压缩)

文章目录 1.什么是GOP&#xff1f;1.1 GOP介绍1.2.GOP中I帧/B帧/P帧1.3.I帧和IDR的区别联系I帧&#xff08;Intra Frame&#xff09;IDR帧&#xff08;Instantaneous Decoding Refresh Frame&#xff09;区别总结 1.4 帧与分组的关系1.5 SPS与PPSSPS&#xff08;Sequence Param…

【前端视野下的数据库概念探秘】——信息化人员必备知识面试宝典:解码“视图”与“游标”

【前端视野下的数据库概念探秘】——信息化人员必备知识&面试宝典&#xff1a;解码“视图”与“游标” 视图&#xff1a;数据的魔法透镜基本概念前端为何关心&#xff1f;代码示例&#xff1a;案例一功能使用思路 游标&#xff1a;数据流的指针基础认知前端视角代码示例&am…

竹纤维家装元宇宙:虚拟空间与绿色生活的融合

在全球化和科技迅速发展的今天&#xff0c;元宇宙作为一种全新的互联网应用和社会形态&#xff0c;正逐步渗透到人们生活的各个方面。特别是在家装行业&#xff0c;竹纤维作为一种新型环保材料&#xff0c;结合元宇宙的概念&#xff0c;正在引领一场绿色生活的革命。 ### 一、…

6.5 Go 指针

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

beamer修改超链接颜色报错

beamer修改超链接颜色报错 使用 \usepackage[colorlinkstrue, urlcolorblue]{hyperref} % 只将超链接设置为蓝色设置 url颜色时、会报错 这是因为在使用 LaTeX 的 Beamer 类创建演示文稿时&#xff0c; Beamer 自身已经自动加载了 hyperref 宏包&#xff0c;并对其进行了一些…

EasyExcel之动态表头导出不生效

今天接到一个优化需求&#xff0c;表格导出后的表头顺序和页面不一致&#xff0c;要优化成一致的。根据传入的字段&#xff0c;动态导出数据&#xff0c;并保证顺序。 我看到导出的实体类都有ExcelProperty注解&#xff0c;同时也在官网查看了这注解的含义和使用。 ExcelPrope…

如何在Linux系统中搭建Zookeeper集群

一、概述 ZooKeeper是一个开源的且支持分布式部署的应用程序&#xff0c;是Google的Chubby一个开源的实现&#xff1b;它为分布式应用提供了一致性服务支持&#xff0c;包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 官网&#xff1a;https://zookeeper.apach…

3D轻量化的三大应用解决方案

老子云平台https://www.laozicloud.com/ 为不同应用场景提供了三大解决方案。 01 单模型轻量化解决方案 数字化时代&#xff0c;越来越多的C2M定制、文旅、电商等行业&#xff0c;为了开拓市场&#xff0c;提升企业竞争力&#xff0c;开始把目光投向产品的3D展示交互。 单模…

ADuM1201可使用π121U31间接替换π122U31直接替换

ADuM1201可使用π121U31间接替换π122U31直接替换 一般低速隔离通信150Kbps电路可使用π121U31&#xff0c;价格优势较大。速度快的有其它型号可达10M,200M,600M。 本文主要介绍ADUM1201,替换芯片π121U31简单资料请访问下行链接 只要0.74元的双通道数字隔离器&#xff0c;1T1…

一个程序员的牢狱生涯(48)男人

星期一 男人 无论发生了什么事,看守所的一切都在按部就班的进行着,墙上的电视在晚上七点钟的时候准时打开,到了所有的号子集体收看“新闻联播”的时间。 号子里除了小x州站在厕所门口没有动外,其他人都安静地做回自己的位置,同样是坐班的姿势,只不过不用‘自我反省’,不…

【字典树(前缀树) 哈希映射 后序序列化】1948. 删除系统中的重复文件夹

本文涉及知识点 字典树&#xff08;前缀树) 哈希映射 后序序列化 LeetCode 1948. 删除系统中的重复文件夹 由于一个漏洞&#xff0c;文件系统中存在许多重复文件夹。给你一个二维数组 paths&#xff0c;其中 paths[i] 是一个表示文件系统中第 i 个文件夹的绝对路径的数组。 …

xmake+xrepo自建仓库添加交叉编译工具链

xmakexrepo自建仓库添加交叉编译工具链 最近想将交叉编译工具链放到xrepo自建仓库中&#xff0c;在xmake中引用&#xff0c;方便多个电脑快速实现交叉编译。 xmake官方文档感觉不够详细&#xff0c;折腾了好久&#xff0c;这里做个记录。 基本步骤如下&#xff1a; 添加自建…

13.优化界面化的游戏辅助

12.使用mfc实现游戏辅助的界面 在它的代码上进行修改 12.使用mfc实现游戏辅助的界面它的代码是频繁读写游戏的内存&#xff0c;这样不是很好&#xff0c;下面的代码是在它的基础上进行了封装&#xff0c;控制无敌的逻辑在我们申请的内存中实现&#xff08;也就是在一个全局中实…

C语言数组指针和指针数组

在C语言中&#xff0c;“数组指针”和“指针数组”是两个不同的概念&#xff0c;尽管名字相似&#xff0c;但它们的用途和用法有明显的区别。下面我们详细解释一下这两个概念。 ### 数组指针 (Pointer to an Array) 数组指针是指向一个数组的指针。它保存的是数组的地址。假设…

小程序项目创建与Vant-UI引入

一&#xff0c;创建小程序项目 AppID可先用测试号&#xff1b; 模板来源选择 ’全部来源‘ &#xff0c;’基础‘ 。模板一定JS开头的&#xff1b; vant-weapp 官网 vant-Weapp 二&#xff0c;下载vant-weapp 组件 1&#xff0c;在新项目中打开 ’调试器‘&#xff1b; 2…

前端Vue小兔鲜儿电商项目实战Day03

一、Home - 整体结构搭建和分类实现 1. 页面结构 ①按照结构新增5个组件&#xff0c;准备最简单的模板&#xff0c;分别在Home模块的入口组件中引入 src/views/Home/components/ HomeCategory.vue HomeBanner.vue HomeNew.vue HomeHot.vue HomeProduct.vue <script …

COMSOL中液晶材料光学特性模拟

前面我们根据FDTD官方文档设置了液晶指向的模型。COMSOL也可以根据相似的方法设置各项异性的周期性变化的材料。 该方法参考了luneburg_lens的COMSOL文档 在给出的文件中&#xff0c;可以发现定义-变量中可以使用默认坐标作为变量&#xff0c;即xyz。因此&#xff0c;折射率也可…