线性dp:最长公共子串
最长公共子串
- 本文讲解的题与leetcode718.最长重复子数组,题意一模一样,阅读完本文以后可以去挑战这题。
题目叙述:
给定两个字符串,输出其最长公共子串的长度。
输入
ABACCB
AACCAB
输出
3
解释
最长公共子串是ACC,其长度为3。
与最长公共子序列的区别
- 公共子串:字符必须是连续相等的
- 公共子序列:字符必须是相等的,可以不连续。
动态规划思路
- 只有当两个字符串中的字符连续相等的时候,公共子串的长度才不断增加,否则清零
- 因此,我们不难发现,公共子串问题其实是公共子序列问题的一个特殊情况
状态变量以及其含义
- 我们延续
最长公共子序列的思路,可以使用两个指针变量,i和j来遍历a,b字符串。 - 那么我们的
f[i][j]代表着什么呢?因为本题是要连续的子串,因此我们的f[i][j]表示以a[i]和b[j]为结尾的公共子串的长度
递推公式
- 那么,我们很容易的就可以得出递推公式:
f[i][j]=f[i-1][j-1]+1(a[i]==b[j])f[i][j]=0)(a[i]!=b[j])
- 边界条件为:
f[0][j]=0f[i][0]=0
遍历顺序:
- 显然是从上到下,从左到右。
如何初始化?
- 处理好上面所说的边界条件,并且根据递推公式来进行初始化
f数组即可。
举例打印dp数组
- 举例如如图所示:

f[i][j]的值如图所示。
最终代码实现
#include<iostream>
#include<cstring>
using namespace std;
char a[200]="BCCABCCB";
char b[200]="AACCAB";
int f[201][201];
int main(){
int ans=0;
for(int i=1; i<=strlen(a); i++){
for(int j=1; j<=strlen(b); j++){
if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+1;
ans=max(ans,f[i][j]);
}
}
printf("ans=%d\n",ans);
return 0;
}
线性dp:最长公共子串的更多相关文章
- poj1159 dp最长公共子串
//Accepted 204 KB 891 ms //dp最长公共子串 //dp[i][j]=max(dp[i-1][j],dp[i][j-1]) //dp[i][j]=max(dp[i][j],dp ...
- [DP]最长公共子串
题目 给定两个字符串str1和str2, 长度分别稳M和N,返回两个字符串的最长公共子串 解法一 这是一道经典的动态规划题,可以用M*N的二维dp数组求解.dp[i][j]代表以str1[i]和str ...
- DP:LCS(最长公共子串、最长公共子序列)
1. 两者区别 约定:在本文中用 LCStr 表示最长公共子串(Longest Common Substring),LCSeq 表示最长公共子序列(Longest Common Subsequence ...
- [程序员代码面试指南]递归和动态规划-最长公共子串问题(DP,LCST)
问题描述 如题. 例:输入两个字符串 str1="1AB234",str2="1234EF" ,应输出最长公共子串"234". 解题思路 状 ...
- 最长公共子串(DP)
DP基础_最长公共子串 Description 两个序列的最长公共子串,这个子串要求在序列中是连续的.如:"bab"和"caba" (可以看出来最长公共子串是& ...
- 经典算法-最长公共子序列(LCS)与最长公共子串(DP)
public static int lcs(String str1, String str2) { int len1 = str1.length(); int len2 = str2.length() ...
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...
- HDU 1503 带回朔路径的最长公共子串
http://acm.hdu.edu.cn/showproblem.php?pid=1503 这道题又WA了好几次 在裸最长公共子串基础上加了回溯功能,就是给三种状态各做一个 不同的标记.dp[n][ ...
- 动态规划(一)——最长公共子序列和最长公共子串
注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...
- 最长公共子串 NYOJ 36
http://acm.nyist.net/JudgeOnline/problem.php?pid=36 最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 ...
随机推荐
- Linux 命令指南
做这个东西有两个用处,一是初赛会考,二是考场上用 windows 哪里数组越界你都不知道直接 RE 爆炸. sudo -s 输入后填写密码获得管理员权限. cd 打开文件或者目录,用法是 cd 目录名 ...
- msgpack的使用
1.引入包 <!--msgpack依赖--> <dependency> <groupId>org.msgpack</groupId> <artif ...
- Mac Mysql初始化密码
初始化密码 step1 苹果->系统偏好设置->最下面一行上点击mysql图标, 在弹出页面中 关闭mysql服务(点击stop mysql server) step2 登录终端:comm ...
- var 和 let 在 jQuery中的区别
下面通过代码案例来进一步解释 var 和 let 在 jQuery link 函数中的区别: (function ($) { $.fn.link = function () { // Example ...
- PositiveSmallIntegerField、SmallIntegerField和IntegerField
当您在Django中定义模型时,有几种不同的整数字段类型可供选择,包括PositiveSmallIntegerField.SmallIntegerField和IntegerField.以下是这三种整数 ...
- 2024-07-17:用go语言,给定一个整数数组nums, 我们可以重复执行以下操作: 选择数组中的前两个元素并删除它们, 每次操作得到的分数是被删除元素的和。 在保持所有操作的分数相同的前提下,
2024-07-17:用go语言,给定一个整数数组nums, 我们可以重复执行以下操作: 选择数组中的前两个元素并删除它们, 每次操作得到的分数是被删除元素的和. 在保持所有操作的分数相同的前提下, ...
- 暑假java自学进度总结02
一.今日所学: 1.配置环境变量 在系统内配置java路径后,再在path中 利用系统路径配置Java编译工具和运行工具路径. 2.下载并安装Natepad++,并且配置相关设置 3.初步了解了Jav ...
- vue进阶一~数据响应式,数据响应到视图层,手写v-model,订阅发布者模式,
1,数据响应式 当数据发生改变的时候,我们立即知道数据发生改变,并做出相关的操作:发送请求,打印文字,操作DOM等. 1.1,vue实现数据响应的原理 vue中使用了两种模式来实现数据响应式,分别是v ...
- 再读vue
app.vue是项目的主组件,页面的入口文件 main.js是项目的入口文件 vue.config.js是vue-cli的配置文件//用这个配置代理,端口号 例如 const { defineConf ...
- 如何实现对ELK各组件的监控?试试Metricbeat
一.前言 开发排查系统问题用得最多的手段就是查看系统日志,ELK 是 Elastic 公司开源的实时日志处理与分析解决方案,已经为日志处理方案的主流选择. 而在生产环境中,如何针对 ELK 进行监控, ...