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

前缀树(Trie)(字典树)

做leetcode的时候看到前缀树,听都没听过,后来才知道前缀树就是字典树。之前学过,在OJ项目中用字典树来实现黑白名单限制。浅浅复习一下吧

用字典树来实现黑白名单限制 实现步骤

(1)定义黑名单

import java.util.Arrays;
import java.util.List;private static final List<String> blackList = Arrays.asList("Files", "exec");

(2)初始化字典树

 使用 HuTool 的 WordTree 初始化并插入黑名单中的单词。

import cn.hutool.core.text.WordTree;private static final WordTree WORD_TREE;static {// 初始化字典树WORD_TREE = new WordTree();// 插入黑名单中的单词WORD_TREE.addWords(blackList);
}

 (3)校验用户代码

 校验用户输入的代码是否包含黑名单中的禁用词。

// 校验代码中是否包含黑名单中的禁用词
FoundWord foundWord = WORD_TREE.matchWord(code);
if (foundWord != null) {System.out.println("包含禁止词:" + foundWord.getFoundWord());return null; // 或者抛出异常
}

(4)完整代码

import cn.hutool.core.text.WordTree;
import cn.hutool.core.text.WordTree.FoundWord;import java.util.Arrays;
import java.util.List;public class CodeValidator {// 定义黑名单private static final List<String> blackList = Arrays.asList("Files", "exec");// 初始化字典树private static final WordTree WORD_TREE;static {WORD_TREE = new WordTree();WORD_TREE.addWords(blackList);}// 校验用户代码public static String validateCode(String code) {// 校验代码中是否包含黑名单中的禁用词FoundWord foundWord = WORD_TREE.matchWord(code);if (foundWord != null) {System.out.println("包含禁止词:" + foundWord.getFoundWord());return null; // 或者抛出异常}return code; // 如果没有禁用词,返回代码}public static void main(String[] args) {String code = "System.out.println('Hello, World!');";String result = validateCode(code);if (result != null) {System.out.println("代码校验通过!");} else {System.out.println("代码校验失败!");}}
}

深入理解前缀树概念

1 定义

前缀树(Trie)是一种树形数据结构,用于高效地存储和检索字符串集合。它的每个节点表示一个字符,通过节点之间的连接来表示字符串。

2 结构特点

节点(Node)

  1. 每个节点表示一个字符。

  2. 每个节点包含一个布尔值 isEnd,表示当前节点是否是一个单词的结尾。

  3. 每个节点包含一个数组(或哈希表)next,用于存储其子节点,对应于下一个字符。

根节点(Root Node)

  1. 根节点不存储任何字符,但它是树的起点。
  2. 从根节点开始,通过路径上的字符可以拼接出完整的字符串。

3 前缀树的实现

1. Trie 类的定义
class Trie {private boolean isEnd; // 标记是否是单词结尾private Trie[] next;   // 存储子节点的数组public Trie() {isEnd = false; // 初始化时,当前节点不是单词结尾next = new Trie[26]; // 初始化一个大小为26的数组,对应26个小写字母}
}

 2. 插入单词(insert 方法)

public void insert(String word) {Trie node = this; // 从根节点开始for (char c : word.toCharArray()) {int index = c - 'a'; // 计算字符在数组中的索引if (node.next[index] == null) { // 如果当前字符对应的子节点不存在node.next[index] = new Trie(); // 创建一个新的 Trie 节点}node = node.next[index]; // 移动到子节点}node.isEnd = true; // 标记单词结尾
}
3. 搜索单词(search 方法)
public boolean search(String word) {Trie node = this; // 从根节点开始for (char c : word.toCharArray()) {int index = c - 'a'; // 计算字符在数组中的索引node = node.next[index]; // 移动到子节点if (node == null) { // 如果子节点不存在return false; // 单词不存在}}return node.isEnd; // 检查最后一个节点是否是单词结尾
}
4. 搜索前缀(startsWith 方法)
public boolean startsWith(String prefix) {Trie node = this; // 从根节点开始for (char c : prefix.toCharArray()) {int index = c - 'a'; // 计算字符在数组中的索引node = node.next[index]; // 移动到子节点if (node == null) { // 如果子节点不存在return false; // 前缀不存在}}return true; // 前缀存在
}

相关文章:

前缀树(Trie)(字典树)

做leetcode的时候看到前缀树&#xff0c;听都没听过&#xff0c;后来才知道前缀树就是字典树。之前学过&#xff0c;在OJ项目中用字典树来实现黑白名单限制。浅浅复习一下吧 用字典树来实现黑白名单限制 实现步骤 &#xff08;1&#xff09;定义黑名单 import java.util.Arra…...

word插入APA格式的参考文献

word插入APA格式的参考文献并实现交叉引用 1. 直接手写并采用超链接 2. 使用zotero插入参考文献后采用超链接(前提下载zotero和对应的插件) 1. 直接手写 APA格式生成 1. 在需要插入参考文献的地方手写格式&#xff0c;如下。 2. 生成书签 名字随便填的&#xff0c;&#x…...

n8n部署docker本地化备份和数据持久化和迁移问题

问题总结&#xff1a; 在一开始的操作中&#xff0c;你遇到的主要问题是 Docker 容器内的文件权限导致了文件无法正确写入和修改&#xff0c;尤其是在复制本地备份文件到容器内时。具体问题表现为&#xff1a; 复制文件后&#xff0c;容器内文件权限错误&#xff1a;你使用 do…...

绘制板块层级图

目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 【实验总结】 【实验目的】 掌握数据文件读取掌握数据处理的方法实现板块层级图的绘制 【实验原理】 板块层级图&#xff08;treemap&#xff09;是一种基于面积的可视化方式&#xff0c;通过每一个板块&…...

国标云台控制状态

1.基本概念 国标联网系统的信息传输、交换、控制方面的都是通过SIP服务器负责通讯得&#xff0c;SIP负责信令流逐级转发。其中最重要的一部分就是和摄像机进行信令交互。 像安全注册、实时视音频点播、历史视音频的回放等应用的会话控制采用IETFRFC3261规定的Register、Invite等…...

PostgreSQL与MySQL哪个适合做时空数据分析?

PostgreSQL与MySQL的定位与区别 定位差异&#xff1a;功能导向与性能优先 PostgreSQL和MySQL作为两大主流开源数据库&#xff0c;其核心设计理念和适用场景存在显著差异。PostgreSQL定位为 对象-关系型数据库&#xff08;ORDBMS&#xff09; &#xff0c;强调功能完备性与标准…...

uniapp利用生命周期函数实现后台常驻示例

在 Uniapp 中&#xff0c;利用生命周期函数实现“后台常驻”主要是通过监听应用的前后台状态变化&#xff08; onHide 和 onShow &#xff09;&#xff0c;并结合 定时器、后台任务或状态保持逻辑 来实现。但需注意&#xff1a; 纯前端 JS 代码无法突破系统对后台应用的限制&am…...

JAVA设计模式——(八)单例模式

JAVA设计模式——&#xff08;八&#xff09;单例模式 介绍理解实现饿汉式懒汉式 应用 介绍 确保一个类只存在一个实例。 理解 就是一个实例&#xff0c;new出来的一个&#xff0c;很简单。不过单例模式分为了懒汉式和饿汉式&#xff0c;其中也有线程安全的实现方式和线程不…...

【亚马逊云】AWS Wavelength 从理论讲解到实验演练

一、什么是 AWS Wavelength&#xff1f; Wavelength——一种新型的 AWS 基础设施&#xff0c;旨在运行需要低延迟或边缘弹性的工作负载。 AWS Wavelength 将按需计算和存储服务引入通信服务提供商网络&#xff0c;使客户能够构建和部署满足其数据驻留、低延迟和弹性要求的应用…...

Uniapp:vite.config.js全局配置

目录 一、基本概述二、配置自动引入插件一、基本概述 vite.config.js 是一个可选的配置文件,如果项目的根目录中存在这个文件,那么它会被自动加载,一般用于配置 vite 的编译选项 二、配置自动引入插件 在项目命令行终端中执行如下代码 npm install unplugin-auto-import…...

Springboot整合阿里云腾讯云发送短信验证码 可随时切换短信运营商

本文描述了在springboot项目中整合实现对接阿里云 和 腾讯云的短信验证码发送&#xff0c;可通过更改配置文件达到切换短信发送运营商(申请签名、短信模版这些本文不在叙述)。 首先看下大体结构&#xff1a; 一、需要导入的jar <dependency><groupId>com.…...

git 查看用户信息

在 Git 中查看用户信息是一项常见的任务&#xff0c;可以帮助你确认当前仓库的配置或全局的 Git 配置是否正确设置。你可以通过多种方式来查看这些信息。 查看全局用户信息 全局用户信息是应用于所有 Git 仓库的默认设置。要查看全局用户信息&#xff0c;可以使用以下命令&am…...

JAVA基础:Collections 工具类实战指南-从排序到线程安全

在 Java 开发中&#xff0c;集合类几乎贯穿每一个项目&#xff0c;而Collections工具类提供了一系列强大的方法&#xff0c;用于操作和增强集合的功能。无论是排序、查找还是线程安全的封装&#xff0c;Collections工具类都是提升代码效率和质量的重要工具。 一、Collections …...

【计算机视觉】TorchVision 深度解析:从核心功能到实战应用 ——PyTorch 官方计算机视觉库的全面指南

TorchVision 深度解析&#xff1a;从核心功能到实战应用 ——PyTorch 官方计算机视觉库的全面指南 1. TorchVision 项目概览核心模块 2. 实战案例&#xff1a;10 大应用场景详解案例 1&#xff1a;使用预训练 ResNet 进行图像分类代码实现常见问题相关论文 案例 2&#xff1a;加…...

case和字符串操作

使用if选择结构 if [];then elif [];then #注意这个地方,java是else if else ; fi 使用for循环结构 使用for循环&#xff0c;语法结构如下所示&#xff1a; for 变量名 in 值1 值2 值3 #值的数量决定循环任务的次数 do命令序列 done#循环输出1到10 for i in {1..10} #注…...

Golang|外观模式和具体逻辑

最终返回的是Document的切片&#xff0c;然后取得Bytes自己再去做反序列化拿到文档的各种详细信息。 外观模式是一种结构型设计模式&#xff0c;它的目的是为复杂的子系统提供一个统一的高层接口&#xff0c;让外部调用者&#xff08;客户端&#xff09;可以更简单地使用子系统…...

关于kafka

1.为什么需要消息队列 举个经典的例子。 你是一个网购达人&#xff0c;经常在网上购物。快递小哥到了你的小区后&#xff0c;立刻给你打电话说&#xff1a;“你的快递到了&#xff0c;请马上来取。” 但你是一个合格的牛马&#xff0c;在上班&#xff0c;不方便取快递&#…...

OpenCV 图形API(67)图像与通道拼接函数-----水平拼接(横向连接)两个输入矩阵(GMat 类型)函数concatHor()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于水平拼接两个 GMat 矩阵&#xff0c;要求输入矩阵的行数必须一致: GMat A { 1, 4,2, 5,3, 6 }; GMat B { 7, 10,8, 11,9, 12 }; GM…...

夜莺 v8.0.0-beta.10 部署

夜莺 v8.0.0-beta.10 部署 1. mariadb-server2. Redis安装3. 下载 n9e-v8.0.0-beta.10-linux-amd64.tar.gz设置 root 用户密码配置文件 配置mariadb的登录密码导入数据库表结构配置为 systemd 启动服务重新加载 systemd配置日志 访问夜莺VictoriaMetrics 时序数据库安装接入数据…...

HTML5好看的水果蔬菜在线商城网站源码系列模板7

文章目录 1.设计来源1.1 主界面1.2 关于我们界面1.3 商城界面1.4 商品信息界面1.5 我的账户界面1.6 联系我们界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#…...

优化问题中变量分类与作用分析

优化问题中的变量分类与作用 在优化问题中&#xff0c;变量的定义和作用因问题类型和建模需求而异。以下从决策变量、控制变量的区别与联系出发&#xff0c;结合其他相关变量进行系统分析&#xff1a; 1. 决策变量&#xff08;Decision Variables&#xff09; 定义&#xff1a…...

RSS‘25|CMU提出统一空中操作框架:以末端执行器为中心,无人机实现高精度遥操作

导读在科技飞速发展的当下&#xff0c;机器人技术不断拓展其应用边界&#xff0c;空中操作领域成为了研究的热点之一。无人空中操纵器&#xff08;UAMs&#xff09;凭借其在高空复杂任务中的巨大潜力&#xff0c;正逐渐改变着诸如高空设备维护、桥梁检测等传统行业的作业模式&a…...

智能指针之设计模式6

本系列文章探讨了智能指针和设计模式的关系&#xff0c;前面五篇文章介绍的是使用设计模式实现了智能指针的相关特性&#xff0c;比如使用工厂模式控制了智能指针对象的创建&#xff0c;使用代理模式控制了资源对象的销毁。本文介绍一下使用智能指针来帮助我们实现相关的设计模…...

【设计模式】GOF概括

一、创建型模式&#xff08;5种&#xff09; 1. 单例模式 (Singleton) 适用场景&#xff1a;全局唯一实例&#xff08;如配置管理、日志工具&#xff09;。C示例&#xff1a;// 所谓的scott mayer单例模式 class Singleton { public:static Singleton& getInstance() {st…...

深入浅出限流算法(三):追求极致精确的滑动日志

在限流的世界里&#xff0c;精度往往是关键。我们已经讨论过固定窗口&#xff08;简单但有突刺&#xff09;和滑动窗口&#xff08;更平滑但仍有格子边界&#xff09;。如果我们需要更精确的控制&#xff0c;滑动日志 (Sliding Log) 算法便登场了。 核心思想&#xff1a;记录每…...

一文读懂Tomcat应用之 CentOS安装部署Tomcat服务

目录 一、Tomcat概述 (一)、Tomcat安装目录简介 (二)、Tomcat配置文件简介 1、server.xml文件 2、web.xml 3、context.xml 4、tomcat-users.xml 5、logging.properties 二、Tomcat安装部署 (一)、环境规划 (二)、安装JDK 1、下载JDK二进制安装包 2、解压JDK二进制…...

JVM 内存分配策略

引言 在 Java 虚拟机&#xff08;JVM&#xff09;中&#xff0c;内存分配与垃圾回收是影响程序性能的核心机制。内存分配的高效性直接决定了对象创建的速率&#xff0c;而垃圾回收策略则决定了内存的利用率以及系统的稳定性。为了在复杂多变的应用场景中实现高效的内存管理&am…...

轻松上手:使用 Docker Compose 部署 TiDB 的简易指南

作者&#xff1a;ShunWah 在运维管理领域&#xff0c;我拥有多年深厚的专业积累&#xff0c;兼具坚实的理论基础与广泛的实践经验。精通运维自动化流程&#xff0c;对于OceanBase、MySQL等多种数据库的部署与运维&#xff0c;具备从初始部署到后期维护的全链条管理能力。拥有Oc…...

Linux权限管理

权限的概念 在 Linux 系统里&#xff0c;权限管理是系统安全的关键环节。权限管理的核心目的是明确不同用户对文件和目录的操作许可范围&#xff0c;以此来保障系统资源的安全与合理使用。权限管理涉及三种不同的用户角色和三种基本的操作权限。 用户角色 所有者&#xff08…...

Crusader Kings III 王国风云 3(十字军之王 3) [DLC 解锁] [Steam] [Windows SteamOS macOS]

Crusader Kings III 王国风云 3&#xff08;十字军之王 3&#xff09; [DLC 解锁] [Steam] [Windows & SteamOS & macOS] DLC 版本 至最新全部 DLC 后续可能无法及时更新文章&#xff0c;具体最新版本见下载文件说明&#xff1b; DLC 解锁列表&#xff08;仅供参考&am…...

架构风格对比

架构风格深度对比&#xff1a;从管道-过滤器到微内核 &#x1f4dc; 引言 在软件架构设计中&#xff0c;不同的架构风格适用于不同的业务场景。本文将深入解析 7种主流架构风格&#xff0c;包括它们的核心思想、优缺点、适用场景&#xff0c;并通过对比表格和示例帮助您选择最…...

V Rising 夜族崛起 [DLC 解锁] [Steam] [Windows SteamOS]

V Rising 夜族崛起 [DLC 解锁] [Steam] [Windows & SteamOS] 注意 这个符号表示 可打开折叠内容 需要有游戏正版基础本体&#xff0c;安装路径不能带有中文&#xff0c;或其它非常规拉丁字符&#xff1b;仅限用于自建服务器&#xff0c;并禁用 VAC &#xff01;&#xff0…...

HTML标记语言_@拉钩教育

目录 1.文本标签 2.格式化标签 3.图片标签 4.超链接标签 5.表格标签 6表单标签 6.1 6.2 6.3 7.行内框架(超链接内套一个页面) 8.多媒体标签(音/视频) 1.文本标签 2.格式化标签 3.图片标签 4.超链接标签 5.表格标签 6表单标签 6.1 6.2 6.3 7.行内框架(超链接内套一个…...

云原生开发革命:iVX 如何实现 “资源即插即用” 的弹性架构?

云原生技术正以惊人的速度重塑软件开发的版图。短短几年间&#xff0c;它从少数技术先驱的实验性方案&#xff0c;迅速崛起为全球企业数字化转型的核心驱动力。Gartner 预测&#xff0c;到 2026 年&#xff0c;全球 85% 的企业将全面采用云原生技术进行应用开发与部署。云原生架…...

whois为什么有时会返回两个不同的域名状态

前阵子发现一直想注册但被别人注册了的一个域名快要过期了&#xff0c;就想着写个脚本跑在电脑上&#xff0c;每分钟检查一次域名状态&#xff0c;一旦域名被正式删除&#xff0c;就发封邮件通知我&#xff0c;这样就不用频繁手动检查域名状态了。 写脚本时发现一个有趣的现象…...

跨境电商店铺矩阵布局:多账号运营理论到实操全解析

在当今竞争激烈的全球电商市场中&#xff0c;跨境电商店铺矩阵布局已成为卖家脱颖而出的关键策略。本文将深入剖析跨境电商店铺矩阵布局的本质、优势&#xff0c;并提供从理论到实操的全方位指导&#xff0c;助力您在全球市场中开启属于自己的销售新篇章。 一、是什么&#xff…...

安卓基础(强制转换)

​​一、强制转换&#xff08;Type Casting&#xff09;​​ ​​1. 什么是强制转换&#xff1f;​​ 当你想将一个类型的对象转换为另一个类型时&#xff0c;如果它们之间存在继承关系&#xff0c;就需要​​强制转换​​。 ​​注意​​&#xff1a;只有存在继承关系的类型…...

VS2022+OpenCasCade配置编译

一、Open CASCADE Technology介绍及安装&#xff08;windows10&#xff09; Open CASCADE Technology&#xff08;简称OCCT&#xff09;是一款开源的 3D CAD/CAM/CAE 软件开发平台&#xff0c;广泛应用于工业设计、工程仿真、制造等领域。开源OCC对象库是一个面向对象C类库&…...

AIGC重构元宇宙:从内容生成到沉浸式体验的技术革命

1. 引言 当数字技术掀开人类交互的新篇章&#xff0c;元宇宙正从科幻构想蜕变为现实——这个由虚拟与现实交织的数字宇宙&#xff0c;承载着未来社会的娱乐、工作与社交形态。作为核心赋能技术&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;正以惊人的创造力&…...

当所有人都用上先进ai,如何保持你的优势?

这不再是你能用上openai模型别人只能用文心一言的时候&#xff0c;而是每个人都可以免费用deepseek r1的时代。如今&#xff0c;办公室里每个人都能随时调用deepseek模型&#xff0c;喊一声“帮我写段代码”便轻松解决问题。在这种情况下&#xff0c;单纯“会用AI”已经很难再形…...

【浙江大学DeepSeek公开课】人类经验与AI算法的镜像之旅

人类经验与AI算法的镜像之旅 人类经验与 AI 算法的镜像之旅一、语言的奥秘&#xff1a;人类如何解码世界二、从符号到智能&#xff1a;AI 的语言理解之路三、DeepSeek - V3&#xff1a;大语言模型的构建与进化四、DeepSeek - R1&#xff1a;推理模型的诞生与突破五、智能体时代…...

【前端】从零开始的搭建顺序指南(技术栈:Node.js + Express + MongoDB + React)book-management

项目路径总结 后端结构 server/ ├── controllers/ # 业务逻辑 │ ├── authController.js │ ├── bookController.js │ ├── genreController.js │ └── userController.js ├── middleware/ # 中间件 │ ├── authMiddleware…...

探针台维护方法

探针台的维护直接影响其测试精度与使用寿命&#xff0c;需结合日常清洁、环境控制、定期校准等多维度操作&#xff0c;具体方法如下&#xff1a; 一、日常清洁与保养 1.‌表面清洁‌ 使用无尘布或软布擦拭探针台表面&#xff0c;避免残留清洁剂或硬物划伤精密部件。探针头清…...

js day8

事件绑定 事件&#xff1a;发生在html元素上的特定动作&#xff0c;鼠标点击&#xff0c;键盘按下&#xff0c;鼠标移入 事件三要素&#xff1a;事件源&#xff08;触发事件的元素&#xff09; 事件类型&#xff0c;事件触发后执行的函数 通过html触发事件&#xff08;不建议…...

大模型训练平台:重构 AI 研发范式的智慧基建

当 AI 研发陷入“高耗低效”困局&#xff0c;如何破局&#xff1f; 在大模型技术爆发的今天&#xff0c;企业 AI 研发正面临前所未有的挑战&#xff1a;某金融机构为训练风控模型投入大量算力&#xff0c;却因数据标注耗时半年延误项目&#xff1b;某制造企业搭建的训练集群利…...

vuex刷新数据丢失解决方案-vuex-persist

安装 npm install -S vuex-persist&#xff08;yarn add vuex-persist&#xff09; 使用&#xff1a; /store/index.js引入vuex-persist配置&#xff1a; import Vue from vue import Vuex from vuex import VuexPersistence from vuex-persist import user from ./modules/use…...

多模态革命!拆解夸克AI相机技术架构:如何用视觉搜索重构信息交互?(附开源方案对比)

一、技术人必看&#xff1a;视觉搜索背后的多模态架构设计 夸克「拍照问夸克」功能绝非简单的OCRQA拼接&#xff0c;而是一套多模态感知-推理-生成全链路系统&#xff0c;其技术栈值得开发者深挖&#xff1a; 视觉编码器&#xff1a;基于Swin Transformer V2&#xff0c;支持4…...

Python依据卫星TLE轨道根数,计算可见时间窗口

1.卫星TLE数据 概括&#xff1a;两行字符串表示的卫星参数 字段 字符串位置&#xff08;以0为起点&#xff09; 描述内容注释1 01–01卫星编号203-07卫星类别卫星类别&#xff08;U表示不保密&#xff0c;可供公众使用的&#xff1b;C 表示保密&#xff0c;仅限NORAD使用&…...

C++?模板!!!

一、引言 在之前我们一起学习了C中类和对象、动态内存管理等相关知识&#xff0c;今天我们将一起学习C中有关模板的相关知识&#xff0c;学完模板之后我们就可以进入C中非常重要的库---STL了&#xff0c;那么模板究竟有什么奥秘呢&#xff1f;让我们一起来看看吧&#xff01; …...

web技术与nginx网站服务

一、Web服务基础概念 Web服务器核心功能 通过HTTP/HTTPS协议提供网页内容&#xff0c;支持HTML、CSS、JavaScript等静态资源&#xff0c;动态内容需结合后端语言&#xff08;如PHP、Python&#xff09;处理36。常用软件&#xff1a;Nginx、Apache、Lighttpd。Nginx以高并发、低…...