最长公共子串问题

0012算法笔记——【动态规划】最长公共子串问题 1、问题相关定义:           (1)字符串:一个字符串S是将n 个字符顺次排列形成的数组, n称为S的长度,表示为len(S) 。S的第i字符表示为S[ i ]。       (2)子串:字符串S的子串S[ i:j ] ( i ≤ j)表示S串中从i到j这一段,也就是排列S[ i ] , S[ i + 1 ] , ⋯,S[ j ] 形成的字符串。       (3)后缀:后缀是指从 阅读详情

最长公共子串问题

给出两个字符串,求这两个字符串的公共子串。(还有一个类似的问题是两字符串的公共子序列,有待分析)。
例子:

INPUT:
abcdefg
gdefacd

OUTPUT:
def

动态规划法

使用动态规划法,相当于用空间换时间。
将一个复杂的大问题,分解为较为简单的子问题,最重要的步骤就是推导状态转移公式。
现有两个字符串,X=(x1, x2, …, xm), Y=(y1, y2, …, yn)
dp[i][j]代表以x[i-1]字符为结尾和以y[j-1]字符为结尾的公共子串长度。(注意!此设定是子串的结尾必须是x[i-1]和y[j-1])。容易推导,当x[i-1] == y[j-1]时,dp[i][j] = dp[i-1][j-1] + 1,否则,dp[i][j]=0。因为假如x[i-1]字符和y[j-1]字符不相等的话,以x[i-1]字符为结尾和以y[j-1]字符为结尾的公共子串就不存在,长度为0;假如相等,最短长度也为1,若之前还存在长为L的公共子串,那么长度就为L+1。
所以状态转移公式为:
if x[i-1] == y[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
if x[i-1]!=y[j-1]:
dp[i][j] = 0

python代码:

def findLongestSubString(s1, s2):
    m = len(s1)
    n = len(s2)
    dp = [[0 for i in range(n + 1)] for i in range(m + 1)]
    mmax = 0
    start = -1
    for i in range(1, m+1):
        for j in range(1, n+1):
            if s1[i-1] == s2[j-1]:
                dp[i][j] = dp[i-1][j-1] + 1
                if dp[i][j] > mmax:
                    mmax = dp[i][j]
                    start = i - mmax
    return s1[start:start+mmax]
最长公共子串问题的后缀数组解法 二分枚举答案A,假设N个串可以有长度为A的公共字串,并对A的可行性进行验证。如果验证A可行,A'(A' 于是问题就集中到了,如何验证给定的长度A是否为可行解。方法是,找出在Height数组中找出连续的一段Height[i..j],使得i=A,并且i-1 具体查找i..j时,可以先从前到后枚举i的位置,如果发现Height[i]>=A,则开始从i向后枚举j的位置,直到找到了Height[j+1] 阅读详情

相关推荐

输入两个字符串,求它们最长公共字串的长度

输入两个字符串, 求它们最长公共字串的长度

最长公共子串与最长公共子序列问题

题目:1、最长公共子串问题(子串:连续的字符串)str ="abcde",“ab”"cd"都为子串2、最长公共子序列问题(子序列:保证相对顺序即可)str="abcde","ac" ,"ae"都为子序列。在概念上可以说,子串是特殊的子序列。假定有字符串str A , lenA = n, str B , lenB =m;解法:两个题目都是动态规划问题。最长子串的问题,因为是子串是连续的。dp[i][...

qq_34650169的博客 291

从稳压管到LDO芯片:一张图看懂线性电源的‘内卷’进化史

本文追溯了从稳压管到LDO芯片的线性电源技术进化历程,详细解析了各阶段的技术突破与局限。重点探讨了现代LDO在超低功耗、高精度控制等方面的创新,并提供了实战选型的黄金法则,帮助工程师在电子设备小型化与低功耗化趋势中做出最优选择。

weixin_42525551的博客 205

最长公共子串,出去重复子串

1.给定字符串A和B,输出A和B中的最大公共子串.     比如A = "aocdfe", B = "pmcdfa" 则输出"cdf" 2.实现一个程序,从键盘输入两个字符串,连接两个字符串,并去掉其重复子串,输入的字符串中只能是字符和空格,字符串以空格进行分割.   例:输入两个字符串如下:   "what is your name"   "my name is bourne"

tianmo2010的专栏 1535

手把手教你用Simulink搭建交流异步电机矢量控制模型(附完整仿真文件)

本文提供了一份详细的Simulink仿真指南,手把手教你从零开始搭建交流异步电机矢量控制模型。内容涵盖主电路搭建、坐标变换实现、双闭环PI调节器设计、转子磁链观测器调试等核心步骤,并附有完整的仿真文件,帮助读者跨越理论到实践的鸿沟,掌握高性能电机控制系统的建模与仿真技能。

pz890123的博客 665

酒店前台pms管理系统

对于酒店经营者来说,选择一款优秀的管理系统,是提升运营效率、优化客人体验的关键。PMS酒店管理系统凭借其强大的房态管理、实时数据监控、OTA直联、无人值守等功能,已经成为许多酒店提升管理水平的得力助手。无论是大中型酒店,还是小型民宿,PMS系统都能根据不同需求提供量身定制的解决方案,帮助酒店实现精细化管理、提高运营效率。如果你也在为酒店管理中的繁琐琐事而困扰,不妨尝试一下PMS酒店管理系统,感受科技带来的便利与高效,让你的酒店运营更上一层楼!

2409_89897808的博客 2483

动态规划——最长公共子串问题

问题描述: 说明:求解两个字符串的最长公共子字符串,必须连续 动态规划求解步骤 Step 1: 分析最优解的性质,刻画其结构特征 Step 2: 递归地定义最优解 仅当X[i]=Y[j]时,d[i,j]=d[i-1,j-1]+1;即当且仅当字符串X[i]=Y[j]时 X[i],Y[j]的最长公共子字符串长度d[i,j] 在 X[i-1],Y[j-1]的最长公共子序列长度d...

清风拂面 1068

K8S搭建(centos)完整版

每个人都有惰性,但不断学习是好好生活的根本,共勉!

感谢阅读 4147

leetcode-牛客网-NC127 最长公共子串-连续的子串

一、题目 二、思路 1、求的的是两个字符串的公共子串,子串是连续的 2、构建二维动态数组,记录最长的子串,都初始化为0 3、当两个字符相等时,dp[i][j]=dp[i-1][j-1]+1; 4、实时比较最长的子串,记录子串的最后一位的下标 三、代码 class Solution { public: /** * longest common substring * @param str1 string字符串 the string * @param str2 strin

weixin_45794299的博客 408

Arduino IDE 开发ESP32-S3编译报错 Sketch too big?一步步解决!

解决方法很简单,只需要一步步来修改 Arduino IDE 的配置即可。确保你已经打开 Arduino IDE 并加载了你的 ESP32 代码。如果你也遇到了这个问题,按这个方法试试,应该就能顺利搞定!,如果你需要 OTA,就不能选这个方案,需要换成。,但我回头一想,我这块 ESP32-S3 可是。,按理说存储空间应该足够啊,那这到底是咋回事?,默认方案就装不下了,这时就需要选择更大的。按钮,这次应该不会报错了!,然后在下拉菜单中找到。,可以支持更大的固件。如果你的固件体积超过。,就能正常编译上传。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2136

使用Python实现深度学习模型:智能光污染监测与管理

本项目将通过以下几个步骤实现智能光污染监测:收集光污染图像数据数据预处理构建深度学习模型训练模型评估模型部署模型用于实时监测通过本文介绍的步骤,我们实现了一个使用Python和深度学习技术的智能光污染监测与管理系统。该系统能够自动识别光污染源,为相关管理部门提供科学依据,以便更好地规划和管理城市照明。同时,这一方法还可以扩展到其他环境监测领域,为环境保护贡献力量。

Echo_Wish 593

剑指offer-例题 栈的压入、弹出序列

题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) import java.util.ArrayList; import java.util.Stack; public class Solution { public boolean I

qq_39622795的博客 905

Transformer从菜鸟到新手(一)

从本文开始回顾一下Transformer的原理与实现细节,包括分词算法BPE的实现。最终利用从零实现的Transformer模型进行英中翻译。

日积月累,天道酬勤 2124

图解最长公共子串问题:动态规划

文章深入探讨了最长公共子串问题的动态规划解法及优化拓展。从问题定义出发,清晰区分了子串与子序列的区别。核心介绍了动态规划法,利用二维数组记录以两个字符结尾的最长公共子串长度,状态转移方程根据字符是否匹配决定。重点图文讲解了填充二维数组的过程,使动态规划的原理更易理解。此外,给出了空间优化技巧,附代码实现详细说明。最后,提供拓展思路。

m0_74496615的博客 2529

怎样让你的论文看起来“像人写的”?只用三招直接去除AI味(附提示词)

当然如果你在实际使用中还有其他需求,比如降重润色、改写翻译等,也可以结合七哥的专业写作平台来辅助,这个高级学术平台已经内置了ChatGPT4o、ChatGPT4.1、Claude3.7、满血版DeepSeek-R1等AI大模型,帮你写文献综述、干课题申报、写论文等学术任务绝对每一点问题。比如我自己的一套学术写作平台,其中的“降重与润色”模块整合了多种GPTs应用,除了能帮助调整语言风格、避免雷同表达,还可以顺带降个重,对于提升学术文本的整体质量还是非常有用的。一、为什么用AI写出来的文章会有AI味?

智能AI让学术科研更容易 1685

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

最长公共子串(连续)问题

动态规划有一个经典问题是最长公共子序列,但是这里的子序列不要求连续,如果要求序列是连续的,我们叫公共子串,那应该如何得到这个串呢? 最简单的方法就是依次比较,以某个串为母串,然后生成另一个串的所有长度的子串,依次去母串中比较查找,这里可以采用先从最长的子串开始,减少比较次数,但是复杂度依然很高! 然后重新看一下这个问题,我们建立一个比较矩阵来比较两个字符串str1和str2

2万+

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

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

动态规划从入门到精通 最长公共子串、最长公共子序列问题

子串和子序列都是原字符串或序列的一部分,它们的区别在于子串是相邻的字符组成的一段连续子序列,而子序列是从原序列中取出若干个元素组成的子序列,不一定是相邻的。 最长公共子串问题公式解说:如果两个字母不相同,值为0;如果两个字母相同,值为左上角的值加1,最长公共子串的问题的最终答案并不是在最后一个单元格中,答案为网格中最大的数字——他可能并不位于最后的单元格中。最长公共子序列公式解说:如果两个字母不同,就选择上方和左方中较大的那个,如果两个字母相同,就等于左上方单元格的值加1

m0_62793538的博客 1412

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

DP(最长公共子串问题)

最长公共子串问题:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。最长公共子串就是求给定两个序列的一个最长公共子序列。例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子

ACM 1070

算法复习——动态规划篇之最长公共子串问题

算法复习——动态规划篇之最长公共子串问题 以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子串:给定序列中零个或多个连续的元素(如字符)组成的子序列 公共子串: 给定两个序列XXX和YYY 公共子串示例 ​ 问题是如何求两个给定序列的最长公共子串? 2. 问题定义 最长公共子串问题(Longest Common Substring Problem) 输入: 序列X=<x1,x2,…,xn>X=<x_1, x_2,

NickHan_cs的博客 946

最长公共子串问题——矩阵法求解

最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。 『算法思路』 1、把两个字符串分别以行和列组成一个二维矩阵。 2、比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。 3、通过查找出值为1的最长对角线...

Miserable_ccf的博客 1610
上一篇: 矩阵分析复习
下一篇: sklearn.feature_extraction.text.TfidfVectorizer用法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值