算法: 动态规划解最长公共子串

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)后缀:后缀是指从 阅读详情

继上篇文章“算法:动态规划解 0-1 背包问题”,再发一篇

上篇: http://blog.youkuaiyun.com/span76/article/details/8033953


#include <iostream>
using namespace std;

char a[]="abecd";
char b[]= "abcd";

char result[512];
int rIdx = -1;
int max2 = 0;

int find(char a[], char b[], int aIdx, int bIdx) {
    if ( aIdx < 0 || bIdx < 0) {
        int tIdx = rIdx;
        if( max2 < tIdx+1  ){
            max2 = tIdx+1;
            while (tIdx>=0)
                cout << result[tIdx--];  // 打印最长的串, 当然如果后来发现更长的也会打印
            cout<< endl;
        }
        return 0;
    }

    if (  a[aIdx] == b[bIdx] ) {
        result[++rIdx] = a[aIdx];  // 为了打印
        int ret = 1 + find(a,b, aIdx-1, bIdx-1);
        result[--rIdx]; // 递归的魅力在于能复原现场, 如果匹配,没有找到的最长串, 现场还是会被恢复
        return ret;
    }
    else { // 对比下面的两种情况 
        int m = find(a,b, aIdx-1, bIdx);  
        int n = find(a,b, aIdx, bIdx-1);
        return m>n? m: n;  // 取最优,体现动态规划的特点
    }
}



int main() {
    cout << "!!!Max Common String!!!" << endl;

    int aLen = strlen(a);
    int bLen = strlen(b);
    cout << "1:" << a << endl;
    cout << "2:" << b << endl;

    int maxLen = find(a,b,aLen-1, bLen-1 );
    cout << endl << "max len is " << maxLen ;

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

相关推荐

最长公共子串的动态规划解法及其优化

最长公共子串问题是:给定两个字符串str1和str2,返回两个字符串的最长公共子串(必须连续) 举例: str1 = "abcd12" str2="ebcd32" 它们的最长公共子串是 "bcd" 原始解法: 设dp[i][j] 表示 以str1[i]和str2[j]最为公共子串的最后一个字符的情况下,公共子串最长能有多长。 边界值: 如果 str1[i] = str2[0]则

feiqiangs的专栏 2961

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

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

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

动态规划—最长公共子串

问题描述:有两个字符串str和str2,求出两个字符串中最长公共子串长度。str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最长公共子串长度为5。 算法思路: 把两个字符串分别以行和列组成一个二维矩阵。 比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。 通过查找出值为1的最长对角线就能找到最长公共子串。 针对于上面的两个字符串我们可以得到的二维矩阵如下: 从上图可以看到,str1和str2共有5个公共子串,但最长的公共

sanmi8276的博客 924

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

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

m0_74496615的博客 2530

webpack性能优化-optimization.splitChunks.chunks中的“all“、“async“和“initial“

最初,chunks(以及内部导入的模块)是通过内部 webpack 图谱中的父子关系关联的。CommonsChunkPlugin 曾被用来避免他们之间的重复依赖,但是不可能再做进一步的优化。 ——摘自 webpack 从 webpack v4 开始,移除了 CommonsChunkPlugin,取而代之的是 optimization.splitChunks。 而关于 optimization.splitChunks 中的chunks,webpack 官方文档却没有很好的进行举例解释,只说明了 async.

程序员秋风的博客 3137

使用电荷放大器处理压电加速度计输出

电阻器 R p模拟传感器的绝缘电阻,为产生的电荷创建泄漏路径。在此图中,顶部波形显示传感器产生的电荷,而底部波形显示电荷放大器的输出。这需要具有大输入阻抗的放大级,以防止产生的电荷通过与传感元件并联的放大器的输入阻抗泄漏。换句话说,电荷放大器补偿传感器产生的电荷 q p ,反馈电容器 C F中具有相反极性的等量电荷。因此,任何与传感器并联的绝缘电阻,如电缆的绝缘电阻或传感器的漏电电阻Rp,都不能流过电流。漂移是指电荷放大器输出在一段时间内发生的变化,而不是由被测物理参数的变化(我们讨论的加速度)引起的。

weixin_45260069的博客 3905

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

最长公共子串问题是指给定两个字符串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的博客 4925

为Codex添加任务完成提示音:提升开发效率的实用技巧

在自动化脚本开发和模型训练过程中,实时获取任务状态反馈是提升工作效率的关键。通过Hook机制,开发者可以在代码执行的关键节点注入自定义逻辑,实现各种自动化操作。Codex的Hook系统特别适合用于任务完成提醒,其post_execution节点能准确捕获执行结束事件。技术实现上,只需简单配置TOML文件并编写音频播放脚本,就能让系统在任务完成时自动播放提示音。这种声音反馈机制尤其适用于长时间运行的批量任务和模型训练场景,实测可提升30%以上的工作效率。结合动态音效选择和跨平台兼容方案,该技巧还能扩展为桌面通

weixin_26767391的博客 540

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

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

m0_62793538的博客 1412

从Peer到脉冲地震波:免费Python工具全流程配置教程(PyCharm+Anaconda)

本文详细介绍了如何使用Python工具链(PyCharm+Anaconda)实现从Peer数据库获取地震波数据到生成脉冲地震波的全流程配置。通过开源工具EQTOOL和PySeismicGen,结合Python环境搭建、数据格式转换和脉冲地震动生成技术,为结构抗震分析提供高效、灵活的解决方案。

weixin_29093169的博客 430

嵌入式STM32控制电梯面板

嵌入式STM32控制电梯面板 用点阵来显示电梯向上还是向下运动,用数码管来显示楼层数(由于灯阵显示楼层数比较困难故用数码管代替)。当按下对应的按钮,就可以去到对应层数,可上升可下降。 #include "stm32f10x.h" #include "stm32f10x_exti.h" #include "stm32f10x_it.h" #define uint unsigned int #define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10) #define

code_init_的博客 2111

最长公共子串(动态规划)

查找两个字符串a,b中的最长公共子串_牛客题霸_牛客网 1.找a 和 b 的最长公共子串实际上是在a的子串和b的子串中找最长公共子串 ins[i][j]实际上记录的就是 以a的第i个字符和以b的第j个字符结尾的子串中存在的最长公共子串的长度 接下来我们举个例子: a: abcabcde b: abcd ins[1][1] = 'a' 'a' --> 'a' 1 ins[2][2] = 'ab' 'ab' --> 'ab' 2 ins[3][3] = 'abc' 'ab...

weixin_59551524的博客 6914

基于Python的彭博社新闻高效爬取实战:最新技术与完整代码解析

本文将详细介绍如何使用Python最新技术构建一个高效的彭博社(Bloomberg)新闻爬虫系统。我们将从爬虫基础概念讲起,逐步深入到高级反反爬技术、异步抓取、数据解析与存储等核心环节。文章包含完整的代码实现,采用最新的aiohttp、Playwright等技术栈,并特别关注法律合规性和数据质量保障。通过本文,读者将掌握一个完整的商业新闻爬虫开发流程,并能够根据实际需求进行定制化开发。关键词:Python爬虫、彭博社、Bloomberg、新闻采集、aiohttp、Playwright、反反爬技术。

2201_76125261的博客 1503

最长公共子串

最长公共子串(Longest Common Substring)是一个非常经典的问题,它的基本描述为“给定两个字符串,求出它们之间最长的相同子字符串(要求连续)的长度”。求N个最长为L的字符串的的LCS的方法大致可分为以下几类:1.枚举法显然是简单但极端低效的算法,改进一些的算法是用一个串的每个后缀对其他所有串进行部分匹配,用KMP算法,时间复杂度为O(NL2)。2.动态规划解法:平方的时间算法。3.后缀数组与高度数组解法,利用二分查找技术,时间复杂度为O(NLlogL)。3.广义后缀树方法,时间复杂度为可

狼の禅境 3396

1 初识智能化测试

非常感谢您可以和我一起来聊一聊智能化测试的一些事。智能化测试是一个新鲜又老旧的问题,说新鲜是因为很多人当听到智能化测试都会联想到人工智能、机器学习、深度学习等高大上的技术,很多时候觉得离我们的实际工作还很远;说老旧,是因为智能化测试的一些技术的发展在行业里面已经很久了,例如符号执行、静态分析等技术已经有很长的历史了。近些年,随着测试技术的的飞速发展,智能化测试也有了越来越多的实践,优秀的开源项目慢慢的被行业推行并且落地。那么在这里我们就一起来聊聊智能化测试以及智能化测试好的思路、实践、方法以及技术落地过程。

Criss@陈磊 2626

【OpenClaw从入门到精通】第37篇:教育“龙虾”进化论——从答疑助教到全流程智能教学系统(2026实测版)

2026年,教育AI已从被动答疑的L1级进化至主动教学的L4级,清华开源的OpenMAIC平台更是打破传统慕课局限,实现互动式AI课堂。本文基于天津工业大学、西北农林科技大学等高校的真实应用案例,结合腾讯云、天翼云的实操指南,详解OpenClaw在教育场景的四层进化路径。核心内容包括:L1-L4级教育自动化架构解析、清华OpenMAIC L4级AI课堂深度拆解、从零搭建智能答疑(QQ群机器人)+作业批改+学情分析全流程系统,以及高校网络安全合规部署方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 798

牛客热题:最长公共子串

​ 首先我们发现遍历dp数组的时候,只会利用到dp数组的左上位置的信息。所以我们可以将dp数组缩减为一维数组的形式,重复利用这部分空间。其中的数据并不是我们想要的。所以我们进行了反向填写的操作。, 我们优化了空间,使用了长度等于第二个字符串的dp数组。的做法之前的j的正向遍历悠久导致。的时间复杂度应该是O(N);的时间复杂度应该是O(N);相当于遍历了一遍二维数组。使用了一个二维的dp数组。相当于遍历了一遍二维数组。

本科在读,致力于Linux/C++方向的学习,同时涉及数据结构与算法,操作系统,数据库mysql等等 1176

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【动态规划】求两字符串的最长公共子串

给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。用动态规划的思想去求解

liangcheng0523的博客 1950

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

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

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

NickHan_cs的博客 946

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

动态规划算法之最长公共子串

#!/usr/bin/python3 # 文件名: 动态规划算法之最长公共子串 # 作者:巧若拙 # 时间:2019-01-02 ''' 两个字符串的最长公共子串与最长公共子序列的区别: 最长公共子串要求在原字符串中是连续的, 而子序列只需要保持相对顺序一致,并不要求连续。 ''' #穷举法:最直接的暴力穷举,需要三重循环,效率较低 def LSS_length_1(n, m):     #最大...

QiaoRuoZhuo的专栏 829

动态规划(6)最长公共子串

问题描述 最长公共子串(Longest Common Substring ,简称LCS)问题,是指求给定的一组字符串长度最大的共有的子串的问题。例如字符串"abcb","bca","acbc"的LCS就是"bc"。 求多串的LCS,显然穷举法是极端低效的算法。可以用动态规划算法求解。 动态规划求解 1 描述最优子结构 记Xm={x1,…xm}和Yn={y1,…,yn}

公众号(猴子数据分析) 3110

求最长公共子串

文章目录求最长公共子串思路一思路二思路三 求最长公共子串 最长公共子串最好的算法是动态规划。其次KMP算法也是解决这类方法中比较好的实现。 思路一 最慢方法,两个字符中每个元素都依次比较,如果相同就检测最长相同串。 #思路一,最慢方法,两个字符中每个元素都依次比较,如果相同就检测最长相同串。 str1 = "aabcdefgh" str2 = "aaabcdef" # str1 = "a...

兰枫 1210

算法-动态规划(4)最长公共子串-C++

动态规划(0)-字符串的交错组成,二维表呈现的是,str1,str2 ,aim三个字符串的关系,那么本篇最长公共子串就是只是str1,str2两个字符串的关系。 问题:给定两个字符串,返回两个字符串的最长公共子串。 举例:str1="1AB2345CD",str2="12345EF",返回“2345” 思路:dp[][] 表示 把str1[i]和str2[j] 当作公共子串最后一个字符时,公共子串...

aggie4628的专栏 1135

牛客题解 | 最长公共子串

牛客题库题解牛客题库题解

wc529065的博客 707
上一篇: 算法:求行列式 C语言实现
下一篇: Unix 笔记:malloc and sbrk
span76
博客等级 码龄18年 117粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值