利用后缀数组求字符串的最长重复子串的算法 利用二维数组求两个字符串的最长公共字串(动态规划)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

[问题描述]

 

1-  求一个字符串中存在的最长的重复子串[后缀数组]


2-  求两个字符串的最长公共字串            [动态规划]

 

[问题解决]

 

1-利用  “后缀数组”(需排序)  求字符串中存在的最长的重复子串,要建立指针数组并通过qsort排序

   时间复杂度是O(nlogn)主要开销在于排序的过程。

 

2-利用 “二维bool数组”来解决两个字符串的最长公共子串,找出正对角线中连续true最长的对角线,定位到两个字符串中的始末位置。空间复杂度是O(M*N) , 时间复杂度O( M(M+N) ) (M<=N),主要的时间负载度在于字符串扫描和对角线扫描。

 

[程序实现] 2-待续

 

1-  求一个字符串中存在的最长的重复子串[后缀数组]

 

后缀数组详解 后缀是指从某个位置iii开始到整个末尾结束的一个特殊子字符串rrr的第iii个字符开始的后缀表示为suffix(i)suffix(i)suffix(i),也就是suffix(i)=r[i…len(r)−1]suffix(i)=r[i…len(r)−1]后缀数组sasasa是一个一维数组,它保存1…n1\dots n1…n的某个排列sa[1。...... 阅读详情

相关推荐

后缀数组(Suffix Array)

啥是后缀数组?难不难? 后缀数组看上去是一个很高深,很玄妙的东西。 但首先,我们要树立一个观点:它!不难!! 实际上,他也真的不难。难的只是其中一个想法的操作。除此以外,不难。 后缀数组的概念 首先,我们需要了解一下什么是后缀 后缀,顾名思义,缀在后面的东西。在字符串中,就是缀在字符串后面的东西,大家可以联系一下英语单词中的后缀来理解。 举个例子 字符串:abaab 后缀分别有: abaab, ...

一个小渣渣的博客:) 1506

后缀数组 详解

字符串前缀:从字符串开头到字符串某个位置 字符串后缀:从字符串某个位置到字符串结尾 ( 原 和 空字符串 也是 前缀(后缀)) 后缀数组:将所有后缀按字典序排序后,得到的数组 如果我们直接将每个字符串进行比较,复杂度为 O( nlogn * n ) ...

gronkie的博客 4159

最长公共 二维数组 Go实现

参考:https://blog.csdn.net/dongyanwen6036/article/details/87914940 //CommonSubstr 寻找两个字符串间的最大相同子 func CommonSubstr(A string, B string) string { //构造BxA的二维数组C,每个元素C[i][j]包含两个信息:1、该元素对应的B[i]与A[j]两个字符是否相同 //2、 如果B[i]与A[j]相同,且各倒退一个字符B[i-1]A[j-1]也相同,则与前面.

HayPinF的博客 391

后缀数组(suffix array)详解

写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具。 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料。 其实后缀数组后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, 能够实现后缀树的很多功能而时间复杂度也不太逊色,并且,它比后缀树所占用的空间小很多。 可以说,在信息学竞赛中后缀数组后缀树要更为实用! 因此在本文中笔者想介绍一下后缀数组的基本概念、构造...

weixin_34198762的博客 1016

leetcode 718 最长重复子数组 动态规划

题目描述 给两个整数数组 A 和 B ,返回两个数组公共的、长度最长的子数组的长度。 示例 1: 输入: 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 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-length-of-rep

zheren8247的博客 686

最长字串、子序列、回文字串、回文子序列

文章目录一、最长公共序列二、最长公共三、最长回文子序列四、最长回文子、五、最短回文子六、最长重复子七、最长公共前缀 一、最长公共序列 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串最长 公共序列 的长度。如果不存在 公共序列 ,返回 0 。 样例:text1 = “abcde”,text2 = “ace”,输出3 思路: 想象一个二维数组,找的是一条不连续的从左上到右下的最长路径 因为是子序列,不要连续,可以在比对两个值是否相等给二维数组赋值的过程中顺

sinat_38705282的博客 841

最长公共字符串

描述: 两个输入序列最长公共字符串的长度。子字符串中的所有字符在源字符串中必须相邻。 如字符串:21232523311324和字符串312123223445,他们的最长公共字符串为21232,长度为5。 输入格式: 两行,第一行为第一个字符串X,第二行为第二个字符串Y,字符串不含空格并以回车标示结束。X和Y的长都不超过100000。 输出格式: 两行

智公博客的专栏 8054

最长上升子序列 最长公共序列 最大字段和 最长重复子

1、最长递增子序列 链接:https://www.nowcoder.com/questionTerminal/585d46a1447b4064b749f08c2ab9ce66 来源:牛客网 对于一个数字序列,请设计一个复杂度为O(nlogn)算法,返回该序列最长上升子序列的长度,这里的子序列定义为这样一个序列U1,U2...,其中Ui < Ui+1,且A[Ui] < A[Ui+1]。 给定一个数字序列A及序列的长度n,请返回最长上升子序列的长度。 测试样例: [2,1,4,3.

mysterious superstar 617

代码随想录算法训练营第53天| 1143.最长公共序列 1035.不相交的线 53. 最大子序和 动态规划

JAVA代码编写给定两个字符串text1和text2,返回这两个字符串最长的长度。如果不存在,返回0。一个字符串的是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。"ace""abcde""aec""abcde"两个字符串的是这两个字符串所共同拥有的子序列。text2。

Catherinemin的博客 1199

java笔试day 19 ①最长公共(动态规划)-中等②汽水瓶(取余取摩操作)-简单

目录 ①两个字符串最长公共 ②汽水瓶(数学思想,取余取摩)两个字符串最长公共 动态规划思想: 动态规划和递归是类似的,都是以分治作为主要思想,将大问题划为小问题,先解决小问题,再用小问题的解来推导大问题的解 四个要素: 1.问题中的抽象状态 2.状态转移方程 3.状态初始化 4.返回值 在这一道题目中通过动态规划来进行题解,该题抽象状态就是:两个字符串中的最长公共,也就是解a的前i个字符和b的前j个字符中最长公共字串的长度最后将题目进一步抽象:以a.

weixin_52748001的博客 267

力扣子序列问题总结

力扣子序列问题总结

csD_Dscnnnnnnn的博客 424

代码随想录算法训练营第五十三天 | LeetCode 1143. 最长公共序列、1035. 不相交的线、53. 最大子数组

dp 数组的初始化:从递推公式可看出,i,j 是需要这三个方向推导出来的,因此要把第一行和列初始化了,即 dp[0][j] 和 dp[i][0],那么根据 dp 数组的含义,是跟 [0,i-1] 和 [0,j-1] 比较,本来就是 0 了再减 1 就成负的,就是一个空的字符串的,那么即 nums1 和空的字符串最长公共序列以及 nums2 和空的字符串最长公共序列就应该是 0,因此都初始化为 0。中的重复子数组是连续的,本题也是要重复子数组,要按照数组的顺序,虽然可以不连续。

Hsusan的博客 300

LeetCode--动态规划基础概念总结和经典题目解析汇总

后续补充,先完成目录

数据挖掘+大数据研发+算法学习 445

算法题分类整理

算法题整理

m0_56266038的博客 967

后缀数组

后缀数组是一个比较强大的处理字符串算法,是有关字符串的基础算法,所以必须掌握。 学会后缀自动机(SAM)就不用学后缀数组(SA)了?不,虽然SAM看起来更为强大和全面,但是有些SAM解决不了的问题能被SA解决,只掌握SAM是远远不够的。 顾名思义,后缀数组就是记录所有后缀数组,同时,它也是有序的。后缀数组 SA 可以帮助我们解决单字符串问题、两个字符串的问题和多个字符串的问题等 比如说字符...

邵光亮的博客 653

字符串处理之后缀数组(Suffix Array)原理

后缀数组(Suffix Array)是某个字符串的所有后缀按字典序排序后的数组。给定字符串S,其所有后缀为S[0...n-1]S[1...n-1], ...,S[n-1](共n个)。将这些后缀按字典序排序后,记录排序后的后缀起始下标,即为后缀数组sa。示例字符串,其后缀数组为a(下标5)ana(下标3)anana(下标1)banana(下标0)na(下标4)nana(下标2)优势高效构建:倍增算法的时间复杂度为 O(n log n)。功能强大:支持快速查找子、LCP等问题。适用场景。

xiaoyu❅的博客 836

算法与数据结构】—— 后缀数组

后缀数组是处理字符串的有力工具。后缀数组后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能且时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多。可以说,在信息学竞赛中后缀数组后缀树要更为实用。

酱懵静的博客 2621

后缀数组(Suffix Array)

这个悲剧的东西在经历了半个月的研究后,终于研究明白了…………学会了之后突然发现,这个东西实在是太nb了~~首先还是先说一说这个东西的精髓~所谓后缀数组就是把一个整的所有后缀的信息以一种比较高效的方式提取出来。而这种工具就是后缀数组。为什么我们偏偏选择了后缀呢?因为我们发现了了一个非常不错的现象——整个的所有子实际上就是所有后缀的一个个前缀。这样,几乎所有类型的字符串问题都可以变成后缀

天空の行者 4138

字符串处理【后缀数组】 - 原理2 后缀数组

字符串处理【后缀数组】 - 原理2 后缀数组

代码改变世界 1621
上一篇: 最佳购物方案的题目
下一篇: 一个路径的可能性选择的问题
roynee
博客等级 码龄18年 31粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值