截止到目前我已经写了 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)mn分别表示两个字符串的长度

空间复杂度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)mn分别表示两个字符串的长度
空间复杂度O(n),只需要一个一维数组即可

总结

这题比较简单,很久以前也讲过这题370,最长公共子串和子序列,之前只是返回一个具体的数字即可,而这题需要返回具体的公共子串,多了一步。

动态规划解最长公共子串相关推荐

  1. 动态规划 dp03 最长公共子串问题 c代码

    题目: 若序列Z是序列X的子序列,又是Y的子序列,则称Z是序列X与Y的公共子序列.例如序列"bcba"是序列"abcbdab"与"bdcaba&quo ...

  2. 动态规划之最长公共子串

    一 问题引入 在生物学中,经常需要比较两个不同生物的DNA,一个DNA串由由一串称为碱基的的分子组成,碱基有鸟嘌呤,腺嘌呤,胞嘧啶,胸腺嘧啶四中,我们用英文字母的首字母表示四种碱基,那么DNA就是在有 ...

  3. 总结几个字符串类的动态规划(最长公共子串,回文子串,子序列)

    在阅读下面的题目之前,首先需要确定的是,求子序列还是子串,子串需要是连续的,子序列无需连续,比如 "Hello",子串可以是 Hel, llo, lo 等,子序列可以是 Hlo, ...

  4. 动态规划解最长公共子序列(LCS)(附详细填表过程)

    目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...

  5. 动态规划:最长公共子串 最长公共子序列

    一.最长公共子串 1. 题目 给定两个序列 X 和 Y,如果 Z 即是 X 的子串,又是 Y 的子串,我们就称它是 X 和 Y 的公共子串,注意子串是连续的. 例如 X = { A, B, C, D, ...

  6. 动态规划解最长公共子序列问题(LCS)C语言加注释

    http://blog.csdn.net/baidu_20363843/article/details/49448255

  7. 动态规划算法解最长公共子序列LCS问题

    动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...

  8. 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...

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

    1.求最长公共子串的长度 问题描述:有两个字符串str和str2,求出两个字符串中最长公共子串长度.str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最 ...

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

    前言 动态规划是大厂的热门考点,其中最长公共子串与最长公共子序列这两道题出现得尤其频繁,这两道题其实有挺多变种,很适合考察侯选人对动态规划的掌握情况,今天我们就先来看看如何求解最长公共子串,图文并茂, ...

最新文章

  1. 2021-06-29快速找出Excel表格中两列数据不同内容的3种方法!
  2. C++ Primer 第10章 习题10.23
  3. java入门第六天课程_Java基础知识——第六天
  4. Shell(7)——case
  5. inet_pton, inet_ntop
  6. 分享一下自己写的PHP函数
  7. -webkit-有意思的属性
  8. 2018司法人工智能:罪名预测、刑期预测、法条推荐
  9. Nginx防止恶意解析-禁止通过IP访问网站
  10. 如何在vim中交换两个打开文件(在拆分中)的位置?
  11. 数模(6):Leslie矩阵人口模型
  12. WebView加载淘宝,天猫链接失败
  13. matlab图像取样和量化,一文看懂数字图像的取样和量化
  14. 2021年茶艺师(中级)考试内容及茶艺师(中级)找解析
  15. systemctl开机启动设置
  16. Excel VBA 批量取工作表名称
  17. S3C2440下clock的源码分析
  18. 洛谷3426 [POI2005]SZA-Template 恶臭dp+kmp
  19. Centos7下安装yum install net-tools一些常见问题
  20. 子网掩码和prefixlength

热门文章

  1. tts高级编程 android,Android TTS(TextToSpeech) 使用
  2. DO56 物流信息网
  3. 教你几招提高自媒体文章原创度
  4. cad黑色背景变成白色_CAD操作记不全?看这个就够了!附上全面整理,动图教程-深圳造价培训...
  5. 解决“你正在使用的浏览器版本过低,将不能正常浏览和使用知乎”问题
  6. oracle建立图书管理数据库,Oracle数据库设计 图书管理系统
  7. Window同时兼容运行多版本谷歌浏览器chrome
  8. 鲁棒控制 matlab程序,鲁棒控制的在matlab中的程序
  9. 【MySQL】为什么要学习MySQL数据库呢?
  10. JAVA使用Gson解析json数据,实例