算法题目二:寻找最长重复子序列(3) 后缀树

实用算法实现-第8篇 后缀树和后缀数组 [1简介] 8.1    后缀树 一棵后缀树包含一个指定文本的所有后缀,对于在一个长度为N的文本中查找一个长度为M的子字符串,一个后缀树仅仅需要M次比较,而这个比较次数是查找该字符串所需要的最小比较次数。 后缀树有以下特征:一条边可以表示文本的任何非空子串,每个非终端节点,除了根节点,必须至少有两个孩子边,兄弟边表示的子串必须开始于不同的字符。 ababa所对应的后缀树如下所示: 后缀树可以解 阅读详情

本文为转载,有所修改。原作者文章为:http://hi.baidu.com/zealot886/item/5d35b442d059701a886d1072(百度空间)

仅为个人学习备份之用途,无任何其他用途!

 

写这篇文章,主要是因为最近有个课题设计,里面用的字符串匹配。

学习后缀树之前,先了解一下Trie这个数据结构

Trie是一种搜索树,可用于存储并查找字符串。Trie每一条边都对应一个字符。在Trie中查找字符串S时,只要按顺序枚举S的各个字符,从Trie的根节点开始选择相应的边走,如果枚举完的同时恰好走到Trie树的叶子节点,说明S存在于Trie中。如果未到达叶子节点,或者枚举中未发现相应的边,则S没有被包含在Trie中。





后缀树就是一种压缩后的Trie树。
比如 S:banana,对S建立后缀树。
首先给出S的后缀们
0:banana
1:anana
2:nana
3:ana
4:na
5:a
6:空
为了更清楚的表示后缀,我们在后缀的后面加上$
0:banana$
1:anana$
2:nana$
3:ana$
4:na$
5:a$
6:$

然后对其进行分类:
5: a$
3: ana$
1: anana$

0: banana$

4: na$
2: nana$

6: $

后缀树的应用:
example 1:在树中查找an(查找子字符串)
example 2:统计S中出现字符串T的个数
没出现一次T,都对应着一个不同的后缀,而这些后缀们又对应着同一个前缀T,因此这些后缀必定都属于同一棵子树,这棵子树的分支数就是T在S中出现的次数。


example 3:找出S中最长的重复子串,所谓重复子串,是指出现了两次以上
首先定义节点的 ”字符深度“ = 从后缀树根节点到每个节点所经过的字符串总长。找出有最大字符深度的非叶节点。则从根节点到该非叶节点所经过的字符串即为所求。

后缀树的存储:
为了节省空间,我们不在边上存储字符串,而是存储该字符串在原串中的起止位置。空间复杂度O(n)

后缀树的构造:
最简单的方法,使用Trie的构造方法,时间复杂度为O(n^2)
后缀树也可以在O(n)的时间复杂度内构造,但比较复杂
如
基本思路:先向后缀树中插入最长的后缀串(S本身),其次插入次长的后缀串,以此类推,最后插入空串。
定义后缀链接(Suffix Link)=从节点A指向节点B的指针,B所表示的子串是A所表示的子串的最长后缀。既,根节点到A所经过的字符串s=aw,则从根节点到B所经过的字符串为w。

算法所用符号描述:

后缀树的构造,算法流程:
1)定义SL(root)=root,首先插入S,此时后缀树仅有两个节点。
2)设已经插入了S(i),现在要插入S(i+1),分两种情况讨论:
1:P(S(i))在插入之前已经存在,(如,na,ana,a是na的parent),则P(S(i))有后缀链接,令u=SL(P(S(i))),从u开始沿着树往下查找,在合适的地方插入
2:P(S(i))是插入S(i)过程中产生的,此时G(S(i))必定存在并有后缀链接,比如(na,ana,bana),令u=SL(G(S(i))),w=W(G(S(i)),P(S(i))).从u开始,对w进行快速定位,并找到节点v(v可能需要分割边来得到)。令SL(G(S(i)))指向v,从v开始沿着树往下查找,在合适的地方插入新的节点
不断重复以上步骤,即可完成后缀树的构造。


 

    • 2,后缀树的用途,总结起来大概有如下几种 

 

    • (1). 查找字符串o是否在字符串S中。 

 

    • 方案:用S构造后缀树,按在trie中搜索字串的方法搜索o即可。 

 

    • 原理:若o在S中,则o必然是S的某个后缀的前缀。 

 

    • 例如S: leconte,查找o: con是否在S中,则o(con)必然是S(leconte)的后缀之一conte的前缀.有了这个前提,采用trie搜索的方法就不难理解了。 

 

    • (2). 指定字符串T在字符串S中的重复次数。 

 

    • 方案:用S+’$'构造后缀树,搜索T节点下的叶节点数目即为重复次数 

 

    • 原理:如果T在S中重复了两次,则S应有两个后缀以T为前缀,重复次数就自然统计出来了。 

 

    • (3). 字符串S中的最长重复子串 

 

    • 方案:原理同2,具体做法就是找到最深的非叶节点。 

 

    • 这个深是指从root所经历过的字符个数,最深非叶节点所经历的字符串起来就是最长重复子串。 

 

    • 为什么要非叶节点呢?因为既然是要重复,当然叶节点个数要>=2。 

 

    • (4). 两个字符串S1,S2的最长公共部分 

 

  • 方案:将S1#S2$作为字符串压入后缀树,找到最深的非叶节点,且该节点的叶节点既有#也有$(无#)。
数据结构之后缀树 后缀数组 阅读详情

相关推荐

【数据结构】后缀树与前缀树的区别与联系

本文旨在帮助读者理解两种重要字符串数据结构:前缀树(Trie)和后缀树(Suffix Tree)的核心区别。我们将从基础原理出发,通过生活案例和代码实现,深入探讨它们的应用场景及内在联系。核心概念:通过乐高积木模型理解数据结构本质原理对比:可视化流程图展示结构差异实战代码:Python实现自动补全和基因序列分析应用场景:从搜索引擎到COVID病毒变异追踪前缀树(Trie):以单词前缀为构建单位的树形结构后缀树(Suffix Tree):包含字符串所有后缀的压缩树结构模式匹配。

AI 算法实战派 1131

Python实用数据结构:Trie字典树——快速寻找句子中匹配的子串

字典树,又称单词查找树,用于统计排序和保存大量的字符串,可以快速找到句子中匹配的子串。

XerCis的博客 6530

在随意给出的2个字符串中,找出它们共同的最长的子串

【问题描述】 在随意给出的2个字符串中,找出它们共同的最长的子串。 【输入】 输入文件的第一行为一个整数2,接下来有2行,每行为一个字符串,每个字符串的长度均小于255。 【输出】 输出只有一行,即:共同的最长子串,若有多个不同的最长子串(即长度相同),输出任意一个。 文件的输入为文件input.txt,输出为标准输出

最长重复子数组&最长重复子序列

两道字符串DP题 最长重复子数组 https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/ class Solution { public int findLength(int[] nums1, int[] nums2) { int n = nums1.length; int m = nums2.length; int[][] dp = new int[n+1][m+1]

ZzZzZzZ 749

3种方法求 最大连续子序列和

解法1—O(N^2)解法 解法2—O(NlgN)解法 解法3—O(N)解法 可以直接在记事本运行

给定一个字符串,求出其最长的重复子串(腾讯2011年10月15日校招笔试)

腾讯2011年10月15日校招笔试算法编程题

最长重复子数组&&最长公共子序列&&不相交的线

引言 这同样是两种类型的题目,有很多相似的地方和不同的地方,区别依然是连续和不连续之分。 最长重复子数组 给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。 示例: 输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出:3 解释: 长度最长的公共子数组是 [3, 2, 1] 。 提示: 1 <= len(A), len(B) <= 1000 0 <= A[i], B[i] < 100 这道题中说的子数组,其实就是连续的子序列, 1,d

YXXXYX的博客 560

抖音直播间人气接口算法 抖音协议

抖音直播间人气接口算法 抖音协议 抖音算法

Q44804487的博客 1万+

自学动态规划——最长重复子数组(子序列问题)

第一次接触,确实会有些懵,但是看了题解,仔细想想,确实是这么回事。

Caspiannn的博客 438

别再手动调参了!用MATLAB+改进PSO算法,5步搞定机械臂轨迹优化(附完整代码)

本文介绍如何利用MATLAB和改进PSO算法快速优化机械臂轨迹规划,仅需5步即可完成传统耗时的手动调参过程。通过混沌初始化、自适应权重等创新方法,改进PSO算法显著提升优化效率,实现全局最优解搜索,适用于工业自动化中的机械臂控制。文章包含完整MATLAB代码实现,帮助工程师轻松应用于实际生产场景。

weixin_29232121的博客 354

想在瑞芯微RK3588上跑视频分类模型?避开3D卷积这个坑,试试这几种NPU友好的方案

本文探讨了在瑞芯微RK3588上部署视频分类模型时如何避开3D卷积的性能陷阱,提供了三种NPU友好的替代方案:MobileNetV2+GRU组合、Temporal Shift Module(TSM)和帧级池化。这些方案在保持较高准确率的同时,充分利用RKNPU的硬件加速能力,显著提升推理效率。文章还分享了从模型转换到部署优化的完整流程和实战经验。

weixin_28724319的博客 418

最长共同子序列 (Longest Common SubsequenceLCS)

1. 最长共同子序列 (Longest Common Subsequence; LCS) 给定两个序列,找出两个序列中存在的最长子序列的长度。子序列是指以相同的相对顺序出现,但不一定是连续的序列 称为「最长共同子序列」(Longest Common Subsequence; LCS)」 示例: 序列“ ABCDGH”和“ AEDFHR”的LCS为长度3的“ ADH”。 序列“ AGGTAB”和“ GXTXAYB”的LCS为长度4的“ GTAB”。 解题思路 首先看一个2个字符串abcdefg和c

u011342224的博客 1648

若依开源框架(分离版)在人大金仓数据库下使用

对于甲方业务特殊要求,使用国产化数据库人大金仓,作为项目主要存储。这里以若依开源框架整合人大金仓为例,演示如何在真实项目中引入人大金仓。

🐱喵测实验室 5942

数据结构与算法 - 后缀树的入门:字符串匹配的高效结构

摘要 本文深入浅出地介绍了字符串处理中的高效数据结构——后缀树。文章首先通过朴素算法与KMP等算法的对比,指出后缀树在多次查询时的优势(预处理O(n),查询O(m))。随后详细讲解后缀树的定义、构建步骤(从标准Trie到压缩Trie)和核心性质,包括边标签不相交、叶子数与字符串长度相等等特性。文中还列举了后缀树能解决的典型问题,如子串查询、最长重复子串等,并简要介绍了Ukkonen线性时间构建算法。最后提供了一个基于显式插入的简化版Java实现,包含节点设计和基础构建方法。通过清晰的图示和代码示例,帮助读者

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

【论文复现】——基于改进FPFH特征提取的点云模板匹配方法

基于改进FPFH特征提取的点云模板匹配方法 [J]. 应用激光, 2024, 44 (04): 196-204.

点云侠的博客 611

SAP NetWeaver Business Client (NWBC) 的深入解析

SAP NetWeaver Business Client(NWBC)作为 SAP 提供的一种用户界面,旨在为终端用户提供无缝集成传统 SAP GUI 事务和新开发的基于 Web Dynpro ABAP 的应用程序的体验。SAP NetWeaver Business Client(NWBC)是 SAP 推出的用户界面,旨在为终端用户提供单一入口,集成传统的 SAP GUI 事务和新开发的基于 Web Dynpro ABAP 的应用程序。在实际业务场景中,NWBC 的应用提升了用户的工作效率和体验。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1605

算法题目二:寻找最长重复子序列(2) trie树与后缀树的应用

本文是转载!原博客地址为:http://www.cnblogs.com/aiyelinglong/archive/2012/04/09/2439777.html 仅作为个人算法学习的记录之用,不用做任何其他用途。   Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于

1ouis的专栏 1278

30天入门 SAP BTP 开发系列之二:了解 SAP BTP Region 的概念,包含账号申请的详细步骤

SAP BTP 的 Region,实际是一组按地理位置划分的、由 SAP 或合作 Hyperscaler 承载的基础设施栈。这些基础设施栈至少包含多可用区网络、对象存储、计算节点及自动化运维等服务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1464

最长重复子序列问题的后缀数组解法

最长重复子序列问题除了使用穷举法,还可以使用后缀数组和后缀树来求解。这里给出使用后缀数组解决的最长重复子序列的过程,并以“banana”为例进行演示。首先写下一个比较两个字符串从头开始共同部分的长度的函数: int comlen(char *p, char *q) { int i = 0; while(*p&&(*p++ == *q++)) i++; re

ryan_jianjian的博客 1273

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

算法分析与设计(后缀树)

一、后缀树的定义:通过一个树可以表示所有可能的后缀子串; 例子:S=acacag; 1)每一条边用一个字符串标记;2)所有的后缀可以从根结点到所有叶结点的路径读出; 3)结束标记符“$”(避免某些后缀是其他后缀的前驱); 后缀树的特点:1)长度为n的字符串,其后缀树恰好有n个叶子结点(因为有n个后缀); 2)每一条边可以用个数据表示(在原来字符串的起始位置和结束位置); 3)在一个...

)梦想之深邃( 994

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

前缀树和后缀树

今天主要看的是树中的两个比较重要的数据结构——前缀树和后缀树。在此之前,先来看两个问题。(参考博客:从Trie树(字典树)谈到后缀树)

xy的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

后缀树系列三:后缀树的应用

前面两篇转载的后缀树系列文章已经描述了后缀树的线性构建算法。创建后缀树的O(n)算法,除了1995年E. Ukkonen大幅简化的算法,还有Peter Weiner的73年年度最佳算法、Edward McCreight1976的改进算法、Juha Kärkkäinen 和 Peter Sanders2003年进一步简化的线性算法,可以根据自己喜好选择。 转载的本系列文章应该预设有第三篇的(后缀树...

FanJin的博客 3481

树:后缀树

在 trie 数据结构中,给定字符串中所有字符串的每个字母表一个接一个地遍历,每个节点代表一个字母表。如果两个或多个单词以相同的子字符串开头,则相同的子字符串由相同的节点链表示。这是一个压缩的 trie,包括字符串的所有后缀。个后缀中的每一个节点一个,没有后缀是另一个后缀的前缀。下面是我们之前用于进行 try 的相同朋友名称列表的后缀树的表示。后缀树的空间使用量远远大于序列集合的实际大小,无论它是线性的。无论哪种方式,都已经发表了开发基于磁盘的后缀树的实际工作,这些后缀树可以扩展到(几)GB/小时。

新华编程特战队 1215

python字符串查找重复项_查找字符串中最长的重复序列 - python

我需要在字符串中找到最长的序列,但要注意,该序列必须重复三次或更多次。因此,例如,如果我的字符串是:fdwaw4helloworldvcdv1c3xcv3xcz1sda21f2sd1ahelloworldgafgfa4564534321fadghelloworld那么我想返回值“helloworld”。我知道完成此操作的几种方法,但是我面临的问题是实际的字符串非常大,因此我确实在寻找一种可以及时实...

weixin_39541844的博客 1381

后缀树:原理、构建与应用详解

后缀树(Suffix Tree)是一种用于字符串处理的压缩字典树数据结构,它将一个字符串的所有后缀都存储在树中。通过后缀树,我们可以在O(m)的时间复杂度内完成模式匹配(m为模式串长度),这使得它在文本搜索、生物信息学、数据压缩等领域有着广泛的应用。后缀树是字符串处理中的瑞士军刀,虽然构建相对复杂,但一旦建立,就能支持各种高效的字符串查询操作。需要频繁查询:选择后缀树内存受限:选择后缀数组需要最小状态数:选择后缀自动机。

QY8765的博客 237
上一篇: 算法题目二:寻找最长重复子序列(2) trie树与后缀树的应用
下一篇: 算法题目二:寻找最长重复子序列(4) 求给定字符串重复最长的子串
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值