最长公共子串(LCS)

最长公共子串LCS (Longest Common Subsequence) 算法 三个方法都有所借鉴,但代码部分是自己试着写出来的,虽然最后的运行结果都是正确的,但此过程中难免会有考虑不周全的地方,如发现代码某些地方有误,欢迎指正。同时有新的想法,也可以提出! 采用顺序结构存储串,求串s和串t的一个最长公共子串。 方法一 算法思想:借助二维数组可以求出最长公共子串最后一个字符分别在s串和t串中的数组下标。此时可以从s中截取最长公共子串,也可以从t中截取。 SqString MaxComStr(SqString s, SqString t) { SqString str; in 阅读详情

找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。其实这又是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab")

   b  a  b

c  0  0  0

a  0  1  0

b  1  0  1

a  0  1  0

我们看矩阵的斜对角线最长的那个就能找出最长公共子串。

不过在二维矩阵上找最长的由1组成的斜对角线也是件麻烦费时的事,下面改进:当要在矩阵是填1时让它等于其左上角元素加1。

   b  a  b

c  0  0  0

a  0  1  0

b  1  0  2

a  0  2  0

这样矩阵中的最大元素就是 最长公共子串的长度。

在构造这个二维矩阵的过程中由于得出矩阵的某一行后其上一行就没用了,所以实际上在程序中可以用一维数组来代替这个矩阵。(滚动数组设计,就是这个一维数组可以重复使用)

代码如下:


#include<iostream>
#include<cstring>
#include<vector>
#include<string.h>
using namespace std;
//str1为横向,str2这纵向

const string LCS(const string& str1,const string& str2){
    int xlen=str1.size();         //横向长度

    vector<int> tmp(xlen);        //保存矩阵的上一行
    vector<int> arr(tmp);         //当前行

    int ylen=str2.size();         //纵向长度
    int maxele=0;                 //矩阵元素中的最大值
    int pos=0;                    //矩阵元素最大值出现在第几列

    //int arr1[10];
    //memset(arr1,0,sizeof(arr1));
    
    for(int i=0;i<ylen;i++){      //纵向长度,相当于为y轴
        string s=str2.substr(i,1);//就是单一的字符

        arr.assign(xlen,0);       //数组清0


        for(int j=0;j<xlen;j++){  //横向长度,以横向作为位置的记录,相当于为x轴
            if(str1.compare(j,1,s) == 0){// xlen=str1.size(); 
                if(j==0)
                    arr[j]=1;
                else
                    arr[j]=tmp[j-1]+1;

                if(arr[j]>maxele){
                    maxele=arr[j];
                    pos=j;
                }
            }
        }
//      {
//          vector<int>::iterator iter=arr.begin();
//          while(iter!=arr.end())
//              cout<<*iter++;
//          cout<<endl;
//      }
        tmp.assign(arr.begin(),arr.end());//字符串的赋值
    }
    string res=str1.substr(pos-maxele+1 , maxele);//输出的为行的位置,位置和长度
    return res;
}

int main(){
    string str1("21232523311324"); //21232,横向长度
    string str2("312123223445");   
    string lcs=LCS(str1,str2);
    cout<<lcs<<endl;
    return 0;
}

 

 

https://www.cnblogs.com/zhangchaoyang/articles/2012070.html

Longest Common Subsequence (LCS)最长公共子串 Longest CommonSubsequence (LCS). The following are some instances. a)      X: xzyzzyx   Y: zxyyzxz b)     X:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD               Y:MAEEEVAKLE 阅读详情

相关推荐

LCS问题一:输出两个字符串的最长公共子串(Longest Common Substring)

回到最常见的字符串问题了,这里的找两个字符串的最长公共子串,要求在原字符串中是连续的。其实和上面两个问题一样,这里依旧可以用动态规划来求解,其实博主自己也不大擅长动态规划,但是可以仿照上面的思路来操作。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba",则数组如下:   b a b c 0 0 0 ...

qq_28619473的博客 5239

数据结构与算法之最长公共子串

最长公共子串问题是指给定两个字符串S1和S2,求它们的公共子串中最长的那一个。其实就是求两个字符串的最长重复子串。最朴素的算法就是枚举S1和S2的每一对子串,然后判断它们是否相等,时间复杂度是O(n^3)。但是这种算法效率太低,无法满足实际需求。一般采用动态规划的思想进行求解,令dp[i][j]表示以S1的前i个字符和S2的前j个字符为结尾的公共子串的长度,当S1[i]=S2[j]时,dp[i][j]=dp[i-1][j-1]+1;否则dp[i][j]=0。最后找出dp[i][j]的最大值即可。

weixin_47225948的博客 4924

LCS/最长公共子串算法分析

最长公共子串 一、最长公共子串(Longest Common Substring ,简称LCS)问题,是指求给定的一组字符串长度最大的共有的子串的问题。例如字符串"abcb","bca","acbc"的LCS就是"bc"。 求多串的LCS,显然穷举法是极端低效的算法。直观的思路就是问题要求什么就找出什么。要子串,就找子串;要相同,就比较每个字符;要最长就记录最长。所以很容易就可以想到如下的解法

恰同学少年 1916

最长公共子串

最长公共子串

weixin_53235736的博客 3980

安川机器人SOCKET 通讯

命令 功能 参数 示例 返回 SelectJob 选择程序 JobName LineNo SelectJob TEST 0 #SelectJob,Ok StartJob 启动程序 JobName StartJob TEST #StartJob,Ok Pause 暂停当前程序 - Pause #Pause,Ok Continue 继续当前程序 - Continue #Continue,Ok ServoOn 伺服上电 - ServoOn #ServoOn,Ok ServoOf...

记录学习内容 8283

Isaac Gym摄像头数据获取全攻略:从CPU到GPU,教你实时显示RGB与深度图

本文详细介绍了在Isaac Gym中获取摄像头数据的两种高效方案:CPU模式与GPU张量模式。通过实战代码示例,展示了从摄像头配置、数据获取到实时可视化RGB与深度图的全流程,帮助开发者优化机器人仿真与计算机视觉应用的性能。特别强调了GPU模式下的零拷贝访问与张量运算优势,适用于需要低延迟处理的场景。

weixin_29056701的博客 387

动态规划——最长公共子串,没有比这更通俗易懂的了

动态规划——最长公共子串,也是高频的考点,需要重点掌握

青春无问西东 岁月自成芳华 3万+

ROS2实战:手把手教你用CMake集成自定义DDS(以CycloneDDS为例)

本文详细介绍了如何在ROS2中通过CMake集成自定义DDS(以CycloneDDS为例),涵盖环境准备、源码编译、ROS2工作区集成、性能调优及常见问题排查。通过RMW中间件抽象层,开发者可以灵活切换DDS实现,提升系统实时性和可靠性。

weixin_29284201的博客 347

最长公共子序列(LCS) 最长公共子串

1.最长公共子序列 什么是子序列: 例如对于字符串"saabcd",s,a,a是其一个子序列,s,a,b,d也是一个子序列。子序列不要求连续性。 最长公共子序列问题有最优子结构,这个问题可以分解称为更小的问题,因此整个问题就变简单了。同时,子问题的解释可以被重复使用的,也就是说更高级别的子问题会重用更小子问题的解。满足这两点以后,很容易就想到用动态规划来求解。 1.假设两个字符串s1, s2。当其...

bitcarmanlee的博客 1万+

Django框架中settings文件的部署建议

为了更好地管理开发和生产环境的配置,建议将settings文件分为多个文件,分别用于不同的环境。然后,通过在启动应用程序时指定不同的settings文件,来加载相应的配置。在Django框架中,settings.py文件是非常重要的配置文件,它包含了项目的各种设置和选项。在Django框架中,settings.py文件是非常重要的配置文件,它包含了项目的各种设置和选项。可以使用Python的。为了更好地管理开发和生产环境的配置,建议将settings文件分为多个文件,分别用于不同的环境。

WELL_CODER的博客 128

手把手教你学pcie--内存管理和保护机制(一):MPU与其他内存管理和保护机制详解

MPU(Memory Protection Unit)是一种专门用于 ​。,这些机制通常协同工作,形成多层防御体系,兼顾安全性、性能和灵活性。

MHD0815的博客 278

lcs leetcode1143 dp

最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。 示例 1: 输入:text1 = “abcde”, tex.

weixin_46186724的博客 534

55、宇宙微波背景辐射望远镜及其光学系统解析

本文详细解析了宇宙微波背景辐射(CMB)望远镜及其光学系统的设计与优化。内容涵盖折射与反射光学系统的特性、旁瓣控制技术、气球与地面观测系统的对比、探测器阵列的发展、光学系统设计流程以及不同观测场景下的光学系统选择。同时,文章展望了CMB望远镜光学系统的未来发展趋势,包括技术创新、多频段观测、国际合作与大型项目等。通过系统性的分析与对比,为CMB研究提供了全面的技术支持与理论基础。

f9g0h的博客 142

最长公共子串LCS

最长公共子串LCS

敷衍zgf的博客 546

【原创】汇川H5U PLC控制伺服的方法

6、在线调试-进入伺服调试,可以在本软件上进行调试,可以实现原点回归、正向点动、反向电动、使能(这里使能打开时触摸屏上的使能不能打开,会冲突)、复位、停止(如下图所示)。5、在原点返回设置中一般情况下对原点信号、正限位、负限位、原点返回方向、原点返回方式进行设置,其他设置默认不改(如下图所示)。3、在单位换算设置上只需要修改脉冲数和移动量(根据伺服配套导轨上名牌进行设置),其他设置默认不改(如下图所示)。11、双击后右边出现编辑框 在上半部分定义变量(IN、INOUT、OUT、VAR)(如下图所示)。

Qinmingyue13的博客 6662

自适应滤波器在噪声消除中的应用:系统设计与实现

本文设计并实现了一种基于LMS算法的自适应噪声消除系统,能够有效消除周期性背景噪声,提升信噪比10dB以上。系统采用模块化设计,包含音频输入、自适应滤波、信号分析和可视化等核心模块,支持实时处理与参数动态调整。通过Python实现,提供图形界面进行参数设置、频谱对比和音频播放功能,为语音增强提供了一种实用解决方案。

huanghm88的专栏 127

LCS(最长公共子串) python3实现

LCS问题就是求两个字符串最大相同的公共子串;我们现假设有两个字符串X,Y。其长度分别为m,n 我们从X,Y两个字符串的最后一个字符串开始看起 如果 Xm = Yn: LCS(X, Y) = LCS(Xm-1, Yn-1)+ "Xm" 如果Xm != Yn: LCS(X,Y) = max(LCS(Xm-1,Yn), LCS(Xm, Yn-1)) 我们即构建了这样的动态转移方程。如果...

爱发呆的小小曹 3928

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【leetcode】最长公共子序列(LCS)和最长公共子串

这两个概念我之前一直没搞清。 1. 最长公共子序列(LCS) 1.1 问题描述 1.2 思路 利用动态规划。 下一步就要找到状态之间的转换方程。 因此可以根据这个方程来进行填表,以"helloworld"和“loop”为例: 1.3 代码 def LCS(string1,string2): len1 = len(string1) len2 = len(strin...

littlemichelle 4093

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最长公共子串LCS【C语言】

最长公共子串【C语言】 题目: 求顺序串S和顺序串T的一个最长公共子串。 时间复杂度为任意 空间复杂度为任意 代码: 运行情况: Copyright © 2019 wyq. All rights reserved. ...

在人间已是颠 559

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java——最长公共子串问题LCS

Java——最长公共子串问题LCS           求最长公共子序列(Longest Common Subsequence, LCS):如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。但是并不要求子串(字符串一)的字符必须连续出现在字符串二中。       采用一个二维矩阵来记录中间的结果。比如"abab"和"aba",如果两个字符相等就

小黄鸭的博客 4329

LCS最长公共子串:线性dp

LCS最长公共子串 题目: 有两个字符串,串T为ABCBDAB,而串S为BDCABA,求最长公共子串的长度: 首先我们分析,如果有两个字符Ti和Sj,就有以下公式: dp[i][j]=dp[i-1][j-1]+1; T[i]==S[j]; dp[i][j]=max(dp[i-1][j],dp[i][j-1]); T[i]!=S[j]; 可以带本题例子证出,这里就不说明了。 代码: #in...

qq_45249273的博客 332

最长公共子串LCS算法

最长公共子串LCS算法(2008-03-25 15:23:41)转载标签:lcs最长公共子串分类:程序设计    LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位

xeon_pan的专栏 981

最长公共子序列(LCS) 最长公共子串

最长公共子序列(LCS):最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串, 但是各个元素之间的相对顺序不能改变) 但是最长公共子序列和最长公共子串的问题都类似于爬楼梯问题,对于不要求各元素连续的LCS问题来说:当求两字符串[0,i]和[0,j]这两个区间 中的最长公共子序列dp[i][j]有2种来源: (1)当字符串1的第i个元素和字...

weixin_41514525的博客 317

最长公共子序列(LCS)问题的解决及优化、最长公共子串问题

介绍了LCS问题的动态规划思想,并通过将其转化为LIS问题将时间复杂度优化到对数级;同时介绍了其简化问题最长公共子串的解法。

yuhaomogui的博客 5177

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

最长公共子串(LCS),有三种情况:1.公共子串的元素必须相邻. 2.公共子串的元素可以不相邻联单3. 求多个字符串而不是两个字符串的最长公共子串 1.公共子串的元素必须相邻:     LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位

zhendongzd 3310
上一篇: 最长公共子序列 (LCS)
下一篇: 字符串编辑距离(Levenshtein距离)算法
while_black
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值