求最长公共子串

找出两个字符串的最长公共子串 题目: 给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。 输入描述: 输入包括两行,第一行代表字符串srr1,第二行代表字符串str2。 1 ≤ length( str1), length(str2) ≤ 5000 输出描述: 输出包括一行,代表最长公共子串。 示例 输入 1AB2345CD 12345EF 输出 2345 解题思路 只需要几个变量,从右上角点开始,划“捺” 定义出发点,出发点一开始时(0,m-1) 出发点向左移动,遇到边界后向下移动 代码 阅读详情

题目:

给两个字符串,找出它们的最长的公共子串,跟求最长公共子序列不同,这个是求连续的。

思路:

动态规划。
dp[i][j]表示字符串a中[0~i]的子串,字符串b中[0~j]的子串,此时的最大长度。
如果a[i]==b[j],那么dp[i][j]=dp[i-1][j-1]+1;
如果a[i]不等于b[j],那么dp[i][j]=0。
变量end存放当前最长公共子串的最后一个元素的下标。
如果最大长度更新,说明end也要发送相应变化。

代码:

#include<iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
using namespace std;

string findLongestCommonSubstring(string a, string b){
    int la = a.size();
    int lb = b.size();
    vector<vector<int>> dp(la+1,vector<int>(lb+1,0));
    int maxLen = -1;
    int end;
    for (int i = 1; i <= la; i++){
        for (int j = 1; j <= lb; j++){
            if (a[i - 1] == b[j - 1]){
                dp[i][j] = dp[i - 1][j - 1] + 1;
            }
            if (maxLen < dp[i][j]){
                maxLen = dp[i][j];
                end = i-1;
            }
        }
    }
    string str = a.substr(end-maxLen+1,maxLen);
    return str;
}
int main()
{
    string a = "1AB2345CD";
    string b = "12345EF";
    string res=findLongestCommonSubstring(a, b);
    cout << res;
    system("pause");
    return 0;
}
动态规划:求最长公共子串/最长公共子序列 最长公共子序列和最长公共子串区别        最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要求在原字符串中是连续的,而子序列则只需保持相对顺序一致,并不要求连续。例如X = {a, Q, 1, 1}; Y = {a, 1, 1, d, f}那么,{a, 1, 1}是X和Y的最长公共子序 阅读详情

相关推荐

求最长公共子串,简单易懂

求两个字符串的最长公共子串描述算法思路1.代码2.动态规划总结 描述 两个字符串,求出两个字符串最长公共字串的长度。 例如: 输入:abcdbeac acdbcdb 输出:3 算法思路 1.把两个字符串看成一个二维的矩阵; 2.比较矩阵中的点对应的行和列的字符是否相同,相同置为1,否则置为0; 3.找出其中值为1的最长对角线的长度,对应就是最长公共子串的长度。 例如: s1=abcdbeac s2=acdbcdb 可以看出,最长的1对角线长度为4,最长公共子串长度为5。 进一步优化: 在给矩阵元素赋值时,

qq_43725948的博客 4025

利用后缀树求多个字符串的最长公共连续子串(Longest Common Substring)

问题:有N个字符串,计算它们公共的最长连续子串。例如,字符串集合{abcd,bcca,aabc},它们公共的最长连续子串是bc。又如{abcfd,bcabca,aabcf}的公共的最长连续子串是abc。针对本问题,可以用特殊的字符(该字符必须是N个串中没有出现的字符)将N个字符串连起来形成一个新串,然后构建这个新串的后缀树。比如对字符串集合 {abcd,bcca,aabc},可以连成新串abcd$

ljsspace的专栏 4913

【后缀数组求最长公共子串】POJ 2774

根据罗的论文,两个串的中间要加一个ascii码比任何字母都小的字符 最长公共子串(pku2774,ural1517) 给定两个字符串A 和B,求最长公共子串。 算法分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀。求A 和B 的最长公共子串等价于求A 的后缀和B 的后缀的最长公共前缀的最大值。如果枚举A和B 的所有的后缀,那么这样做显然效率低下。由于要计算A 的后缀和B 的后缀的

leolin_的专栏 887

多个字符串的最长公共字串

原文链接:http://imlazy.ycool.com/post.1861423.html  如果所有字符串的长度之和是L,则下面介绍的这个算法的平均效率O(L * logL),但是最坏情况下可能会再乘以O(l),l是每个字符串的平均长度。     首先对于每个字符串,

幽兰止水 3995

求N个字符串的最长公共子串

求N个字符串的最长公共子串

qq_27512741的博客 5646

【机试练习】【C++】【codeup 2432求最长公共子串(串)】

/** *2432: 求最长公共子串(串) *题目描述 *求采用顺序结构存储的串s和串t的一个最长公共子串,若没有则输出false,若最长的有多个则输出最先出现的那一串。 *输入 *输入两个字符串 *输出 *输出公共子串 *样例输入 *abcdef *adbcef *样例输出 *bc */ #include<iostream> #include<s...

Me.Show 681

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

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

m0_74496615的博客 2529

STM32MP157+AD7606BSTZ四通道IEPE传感器采集方案实战(附完整电路图)

本文详细介绍了基于STM32MP157和AD7606BSTZ的四通道IEPE传感器采集方案,涵盖硬件电路设计、软件驱动开发及系统性能优化。通过精确的恒流源设计和同步采样技术,实现高精度振动信号采集,适用于工业振动监测等应用场景。

weixin_42713608的博客 700

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

最长公共子串问题是指在两个或多个字符串之间找到最长的连续子串。子序列可以不连续,子串必须是连续的。解决该问题的方法有暴力枚举法以及动态规划dp。将两串字符串中的字符一一进行比较,得出最长子串的起点和长度后,进行输出。dp[i][j]代表的x的前i个字符串与y的前j个字符串的最长公共子串,如果两个字符相等,则dp[i][j]=dp[i-1][j-1]+1;如果不相等,就说明不满足最长公共子串,自然dp[i][j]=0.

monlyy的博客 558

语音测试(二)音频标注(praat)

通过点击红线下方的圆点进行区域划分,在区域中标注所属的类别。按住Alt+Backspace 键取消蓝色线条。

beishida123的博客 3733

GEE开发之ERA5(气温、降水、压力、风速等)数据获取和分析

前言:ERA5主要提供DAILY和MONTHLY两大类别数据,其中主要包括气温、降水、压力、风速等。

等待着冬天的风的博客 3万+

【C++】求两个字符串的最长公共子串

【C++】求两个字符串的最长公共子串

李嘉佑的博客 2487

Cadence 16.6与17.4双版本共存避坑指南:从安装顺序到环境变量配置

本文是一份详细的Cadence 16.6与17.4双版本共存实战指南。针对硬件工程师和PCB设计者同时处理新旧项目的需求,文章深入剖析了版本冲突根源,并提供了从安装顺序、环境隔离到故障排查的完整解决方案。核心在于通过环境变量精细化管理与脚本控制,实现两个版本的稳定共存与无缝切换,有效解决了文件关联混乱、交互布局失效等常见问题。

html8的博客 975

求最长公共子串的两种方法

求最长公共子串: 输入描述:输入两个字符串 输出描述:输出一个整数 输入:asdfas werasdfaswer 输出:6 一、动态规划 用一维数组代替二维数组,相应的,一维数组的index序列号对应二维的(i,j)有: index = i* 列数+ j; function getLen(str1,str2){ var len1 = str1.leng...

HYeeee的博客 2731

LPDDR4协议规范之 (四)命令和时序

LPDDR4协议规范之 (四)命令和时序命令真值表激活操作读写访问操作读前沿和后沿突发读取操作流程读操作时序写前沿和后沿突发写操作写入均衡(待更新) 命令真值表 激活操作 ACTIVATE命令由两个连续命令组成,Activate-1命令和Activate-2。通过在(Activate-1)时钟的第一个上升沿保持CS HIGH,CA0 HIGH和CA1 LOW来发出Activate-1命令,通过...

YJFeiii的博客 2万+

告别卡顿!OBS Studio最佳录制参数设置指南(适合游戏/网课/会议场景)

本文提供OBS Studio录制参数优化指南,针对游戏、网课及会议三大场景,详细解析帧率、码率与编码器设置。重点推荐利用硬件编码器(如NVENC)实现游戏录制零卡顿,并分享清晰稳定的网课录制与长时间会议录制配置方案,助你告别视频卡顿与音画不同步问题。

e4f5g6h7的博客 1330

求两个字符串的最长公共子串

今天看到关于求两个字符串的最长公共子串的算法,写出来和大家分享一下。 算法:求两个字符串的最长公共子串 原理: 1。 将连个字符串分别以行列组成一个矩阵。 2。若该矩阵的节点对应的字符相同,则该节点值为1。 3。当前字符相同节点的值 = 左上角(d[i-1, j-1])的值 +1,这样当前节点的值就是最大公用子串的长。        (s2)  b  c    d  e (s1)

mjx20045912的专栏 4096

MIT Mini Cheetah--仿真流程

MIT Mini Cheetah–仿真 摘要 由于官方提供代码中,控制仿真环境中的猎豹机器人运动需要遥控器来控制。官方默认推荐使用logitech Gamepad F310游戏手柄:We use the Logitech F310 controller. There’s a switch in the back, which should be in the “X” position. The controller needs to reconnected if you change the switch

Galaxy_Robot的博客 5915

python求两个字符串最长公共子串_python实现:求两个字符串的最长公共子串

假设s1 = 'abcdef' ,s2 = 'mcdea',建立一个(len(s1)+1) x (len(s2)+1)的数组,如下如所示的一个二维数组,代码的操作流程是:# -*- coding: utf-8 -*-"""Created on Thu Oct 4 16:25:35 2018@author: DELL"""'''求两个字符串的最长公共子串思想:建立一个二维数组,保存连续位相同与否...

weixin_39947351的博客 495

【100%通过率】华为od统一考试B卷【需要打开多少监视器】JAVA&Go 实现

某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开:给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器

MISAYAONE的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

poj2217 Secretary 求最长公共子串

poj 2217:http://poj.org/problem?id=2217 求最长公共子串(子串是必须连续的,子序列可以不连续) 举例: S=ABRACADABRA T=ECADADABRBCRDAR 最长公共子串为ADABR,长度为5. 做法:构造一个新字符串S'\0'T,也就是在S和T之间插入一个不会在S和T中出现的一个字符,然后检查后缀数组中的相邻后缀,如果两个起始位置分别...

dezhonger的专栏 260

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java求两个字符串的公共子串_java实现求两个字符串最长公共子串的方法

本文实例讲述了java实现求两个字符串最长公共子串的方法。分享给大家供大家参考,具体如下:这个是华为OJ上的一道题目。首先,如果我们用java写代码,华为OJ有以下三条规则需遵守,否则编译无法通过或者用例无法通过,规则如下:(1)一定不可以有包名;(2)主类名只能为Main;(3)不可以输出与结果无关的信息。好了,按照以上规则,我们写出来的代码如下(此代码不是最优的,只是用来记录华为OJ上java...

weixin_36138524的博客 911

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

求最长公共子串 Longest Common Subsequence

最长公共子串  // Longest Common Subsequence 子串有别于子序列, 子串是连续的, 而子序列可以不连续 /*---------------------------------------------------- 题为求 最长对称子串, 实际可以转化成求最长公共子串对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP...

dlsq3814的博客 98
上一篇: 从数组中选出n个数之和为k
下一篇: 使序列有序的最少交换次数
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值