【算法】前缀树

news/2025/1/18 20:24:06/文章来源:https://www.cnblogs.com/DLShark/p/18515913

前缀树(Trie 树)

基本内容

以树的方式存储字符串的数据结构,方便字符串的查找及判断是否为某一字符串的前缀

  • 入门例子 PHONELST - Phone List - 洛谷 | 计算机科学教育新生态

题目要求:判断一组字符串中是否存在某一字符串是另一字符串的前缀。例如在{“911”, “91140”,“20”,“912”}中,“911”是“91140”的前缀

  • 基本思想

将字符串的每一个元素视为一个节点,例如“911”中将“9”,“1”,“1”视为不同的节点。依次将所有字符串元素进行存储。

  • 变量解释

    ❗ ❗ ❗ 一个元素就是一个节点,只有不同字符串的元素重复路径的时候才属于同一节点

    N:记录一共最多可能有多少个节点;

    son:二维数组,son[N] [10],记录所有节的子节点的索引号idx,第二列为10是因为数字节点的子节点最多是10个,若是字母字符串的话应该是son[N] [26]

    cnt:记录第idx个节点是否为某一字符串的结尾节点

    idx:当前的节点索引号(节点通过数组存储)

  • 核心代码

strs = ["911", "91140", "20", "912"]
for s in strs:p = 0 # 表示头节点for i in range(len(s)):if son[p][int(s[i])] == 0: # 为0表示当前没有该节点,idx为该节点的索引idx += 1son[p][int(s[i])] = idxp = son[p][int(s[i])] # 更新p为下一元素的节点索引# 判断是否为其他字符串的前缀的两种情况# ① 当前节点是其他字符串的结束节点 ② 其他字符串的节点是当前字符串的结束节点if cnt[p] != 0 or (i == len(s) - 1 and son[p][int(s[i])] != 0):flag = Trueprint("NO")breakcnt[p] += 1 # 以索引号为p的节点结尾的字符串加1,可以统计有多少个相同字符串
if not flag:print("YES")
  • 总结
  1. 前缀树是一种以空间换时间的数据结构
  2. cnt 数组不仅仅可以用于记录是否为字符串的结束节点,还可以记录相同字符串的个数

题目

  1. P10471 最大异或对 The XOR Largest Pair - 洛谷 | 计算机科学教育新生态

要求:在一组数找到两个数的最大异或值,以长度为3的数字为例子,当与“001”配对的能达到最大异或值的数字为“110”,即为反码

思路:从最高位开始,尽量找到与当前位数为反码的

例子:在["001","101","100","111"] 中找到与 “111” 最大的异或对,从最高位开始,存在依次与11互为反码的00节点,但在该路径中到了第三层不存在与1互为反码的0节点,因此只能继续选择 1 节点,因此最后能与111组成的最大异或对为001.

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

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

相关文章

Python工具箱系列(五十七)

图像分割与人脸识别 众所周知图像是由若干有意义的像素组成的,图像分割作为计算机视觉的基础,对具有现有目标和较精确边界的图像进行分割,实现在图像像素级别上的分类任务。图像分割可分为语义分割和实例分割两类,区别如下: 语义分割:将图像中每个像素赋予一个类别标签,…

Nuxt.js 应用中的 imports:dirs 事件钩子详解

title: Nuxt.js 应用中的 imports:dirs 事件钩子详解 date: 2024/10/30 updated: 2024/10/30 author: cmdragon excerpt: imports:dirs 是 Nuxt.js 中的一个生命周期钩子,用于扩展导入目录。通过这个钩子,开发者可以灵活地添加、修改或删除项目中的导入目录,从而提高模块…

OSI模型

Java 复习笔记 OSI模型 开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI) 1-7 物联网叔会使用 (资源子网) 应用层为应用程序提供交互服务 。域名系统DNS文件传输FTP支持万维网(www)应用的HTTP协议,支持电子邮件的SMTP协议 表…

12 编程基础:语句与函数

编程有自己的语法, if,then,end if while循环 for循环 将语言打包成函数, 有专门的函数库公开使用,还有声音、图像库

ubuntu安装smaba

1、更新软件包列表sudo apt update2、安装Sambasudo apt install samba3、一旦安装完成,您可以编辑Samba配置文件sudo nano /etc/samba/smb.conf4、在此文件中,您可以设置共享目录和权限。例如,添加一个简单的共享[share]comment = Samba on Ubuntupath = /media/usb/sharer…

刚刚买的域名被DNS劫持了怎么处理

在当今数字化的时代,域名作为网络世界的重要标识,对于个人和企业的在线业务都至关重要。然而,有时会遭遇令人头疼的问题,比如新买的域名被DNS劫持。这不仅会影响网站的正常访问,还可能导致用户信息泄露、业务受损等严重后果。那么,当我们面临这种情况时,应该如何妥善处理…

【笔记】【Android】Manifest中的intent-filter使用

【笔记】【Android】Manifest中的intent-filter使用笔记系列,内容是从网络搜索的结果,不一定是正确的理解。 如果存在谬误,欢迎大家指正。intent-filter是为了标明Activity,Service或者Braodcast Receiver可以相应的intent类型。 基本结构 <activity android:name="…

IIS禁用自动回收

主要设置了线程池里面的 1、启动模式: 由默认值改为AlwaysRunning2、 固定时间间隔:由默认1740 改为 03、将闲置空闲时间改为 0

grafana如何使用定义的变量

1.先看效果 2.定义变量 3.sql语句中使用变量

日志管理系统的系统目标是什么?

在网络安全、数据管理、故障排查等领域,日志都被广泛使用并需要进行有效的管理与分析。因此,日志管理系统的系统目标显得尤为重要,如以下几方面。 1、确保数据的安全性及完整性 在企业和组织的日常运营中,各类信息数据都会通过系统生成和传递,而这种数据往往是宝贵且敏感…

239. 滑动窗口最大值(难)

目录题目法一、暴力枚举法二、双端队列 题目给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。法一、暴力枚举遍历数组,获取每个窗口的子数…