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

字符串匹配算法(三)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}
}

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

相关文章:

  • 长难句打卡5.31
  • 闽盾杯 2021 DNS协议分析
  • 初识Sass
  • openfiler安装部署-1
  • 速盾:cdn如何收费?
  • 云数融合与大数据技术在日常生活中的创新应用探索
  • 【环境栏Composer】Composer常见问题(持续更新)
  • sql server 2017 linux 高可用创建和故障转移
  • Oracle 数据库 varchar2 从 4000 扩展到 32k
  • 矩阵1-范数与二重求和的求和可交换
  • Node.js笔记(万字总结)
  • 解析前端开发中同源策略与配置代理
  • strcpy、strncpy、strcat、strncat、strcmp、strstr字符串函数的使用和模拟
  • Android更新优化 - 增量更新是如何节省用户时间和流量的
  • Python—面向对象小解(3)
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 《剑指offer》分解让复杂问题更简单
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • android 一些 utils
  • Android优雅地处理按钮重复点击
  • Apache Spark Streaming 使用实例
  • express.js的介绍及使用
  • npx命令介绍
  • Octave 入门
  • php的插入排序,通过双层for循环
  • Python 基础起步 (十) 什么叫函数?
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 从零开始学习部署
  • 仿天猫超市收藏抛物线动画工具库
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 力扣(LeetCode)965
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 区块链分支循环
  • 异步
  • 鱼骨图 - 如何绘制?
  • 阿里云ACE认证学习知识点梳理
  • ​Python 3 新特性:类型注解
  • ​什么是bug?bug的源头在哪里?
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #Z2294. 打印树的直径
  • (16)Reactor的测试——响应式Spring的道法术器
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (篇九)MySQL常用内置函数
  • (四)图像的%2线性拉伸
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一)基于IDEA的JAVA基础1
  • (已解决)vscode如何选择python解释器
  • (转)树状数组
  • .dwp和.webpart的区别