动态规划解最长公共子串
截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666
有了递推公式,代码就比较简单了,我们使用两个变量,一个记录最长的公共子串,一个记录最长公共子串的结束位置,最后再对字符串进行截取即可,来看下代码
public String LCS(String str1, String str2) {int maxLenth = 0;//记录最长公共子串的长度//记录最长公共子串最后一个元素在字符串str1中的位置int maxLastIndex = 0;int[][] dp = new int[str1.length() + 1][str2.length() + 1];for (int i = 0; i < str1.length(); i++) {for (int j = 0; j < str2.length(); j++) {//递推公式,两个字符相等的情况if (str1.charAt(i) == str2.charAt(j)) {dp[i + 1][j + 1] = dp[i][j] + 1;//如果遇到了更长的子串,要更新,记录最长子串的长度,//以及最长子串最后一个元素的位置if (dp[i + 1][j + 1] > maxLenth) {maxLenth = dp[i + 1][j+1];maxLastIndex = i;}} else {//递推公式,两个字符不相等的情况dp[i + 1][j+1] = 0;}}}//最字符串进行截取,substring(a,b)中a和b分别表示截取的开始和结束位置return str1.substring(maxLastIndex - maxLenth + 1, maxLastIndex + 1);
}
时间复杂度:O(m*n)
,m
和n
分别表示两个字符串的长度
空间复杂度:O(m*n)
代码优化,把二维数组变为一维数组
public String LCS(String str1, String str2) {int maxLenth = 0;//记录最长公共子串的长度//记录最长公共子串最后一个元素在字符串str1中的位置int maxLastIndex = 0;int[] dp = new int[str2.length() + 1];for (int i = 0; i < str1.length(); i++) {//注意这里是倒叙for (int j = str2.length() - 1; j >= 0; j--) {//递推公式,两个字符相等的情况if (str1.charAt(i) == str2.charAt(j)) {dp[j + 1] = dp[j] + 1;//如果遇到了更长的子串,要更新,记录最长子串的长度,//以及最长子串最后一个元素的位置if (dp[j + 1] > maxLenth) {maxLenth = dp[j + 1];maxLastIndex = i;}} else {//递推公式,两个字符不相等的情况dp[j + 1] = 0;}}}//最字符串进行截取,substring(a,b)中a和b分别表示截取的开始和结束位置return str1.substring(maxLastIndex - maxLenth + 1, maxLastIndex + 1);
}
时间复杂度:O(m*n)
,m
和n
分别表示两个字符串的长度
空间复杂度:O(n)
,只需要一个一维数组即可
总结
这题比较简单,很久以前也讲过这题370,最长公共子串和子序列,之前只是返回一个具体的数字即可,而这题需要返回具体的公共子串,多了一步。
动态规划解最长公共子串相关推荐
- 动态规划 dp03 最长公共子串问题 c代码
题目: 若序列Z是序列X的子序列,又是Y的子序列,则称Z是序列X与Y的公共子序列.例如序列"bcba"是序列"abcbdab"与"bdcaba&quo ...
- 动态规划之最长公共子串
一 问题引入 在生物学中,经常需要比较两个不同生物的DNA,一个DNA串由由一串称为碱基的的分子组成,碱基有鸟嘌呤,腺嘌呤,胞嘧啶,胸腺嘧啶四中,我们用英文字母的首字母表示四种碱基,那么DNA就是在有 ...
- 总结几个字符串类的动态规划(最长公共子串,回文子串,子序列)
在阅读下面的题目之前,首先需要确定的是,求子序列还是子串,子串需要是连续的,子序列无需连续,比如 "Hello",子串可以是 Hel, llo, lo 等,子序列可以是 Hlo, ...
- 动态规划解最长公共子序列(LCS)(附详细填表过程)
目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...
- 动态规划:最长公共子串 最长公共子序列
一.最长公共子串 1. 题目 给定两个序列 X 和 Y,如果 Z 即是 X 的子串,又是 Y 的子串,我们就称它是 X 和 Y 的公共子串,注意子串是连续的. 例如 X = { A, B, C, D, ...
- 动态规划解最长公共子序列问题(LCS)C语言加注释
http://blog.csdn.net/baidu_20363843/article/details/49448255
- 动态规划算法解最长公共子序列LCS问题
动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...
- 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用
2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...
- 动态规划—最长公共子串
1.求最长公共子串的长度 问题描述:有两个字符串str和str2,求出两个字符串中最长公共子串长度.str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最 ...
- 动态规划——最长公共子串,没有比这更通俗易懂的了
前言 动态规划是大厂的热门考点,其中最长公共子串与最长公共子序列这两道题出现得尤其频繁,这两道题其实有挺多变种,很适合考察侯选人对动态规划的掌握情况,今天我们就先来看看如何求解最长公共子串,图文并茂, ...
最新文章
- 2021-06-29快速找出Excel表格中两列数据不同内容的3种方法!
- C++ Primer 第10章 习题10.23
- java入门第六天课程_Java基础知识——第六天
- Shell(7)——case
- inet_pton, inet_ntop
- 分享一下自己写的PHP函数
- -webkit-有意思的属性
- 2018司法人工智能:罪名预测、刑期预测、法条推荐
- Nginx防止恶意解析-禁止通过IP访问网站
- 如何在vim中交换两个打开文件(在拆分中)的位置?
- 数模(6):Leslie矩阵人口模型
- WebView加载淘宝,天猫链接失败
- matlab图像取样和量化,一文看懂数字图像的取样和量化
- 2021年茶艺师(中级)考试内容及茶艺师(中级)找解析
- systemctl开机启动设置
- Excel VBA 批量取工作表名称
- S3C2440下clock的源码分析
- 洛谷3426 [POI2005]SZA-Template 恶臭dp+kmp
- Centos7下安装yum install net-tools一些常见问题
- 子网掩码和prefixlength
热门文章
- tts高级编程 android,Android TTS(TextToSpeech) 使用
- DO56 物流信息网
- 教你几招提高自媒体文章原创度
- cad黑色背景变成白色_CAD操作记不全?看这个就够了!附上全面整理,动图教程-深圳造价培训...
- 解决“你正在使用的浏览器版本过低,将不能正常浏览和使用知乎”问题
- oracle建立图书管理数据库,Oracle数据库设计 图书管理系统
- Window同时兼容运行多版本谷歌浏览器chrome
- 鲁棒控制 matlab程序,鲁棒控制的在matlab中的程序
- 【MySQL】为什么要学习MySQL数据库呢?
- JAVA使用Gson解析json数据,实例