动态规划—最长公共子串
1、求最长公共子串的长度
问题描述:有两个字符串str和str2,求出两个字符串中最长公共子串长度。str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最长公共子串长度为5。
算法思路:
- 把两个字符串分别以行和列组成一个二维矩阵。
- 比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。
- 通过查找出值为1的最长对角线就能找到最长公共子串。
针对于上面的两个字符串我们可以得到的二维矩阵如下:
从上图可以看到,str1和str2共有5个公共子串,但最长的公共子串长度为5。
为了进一步优化算法的效率,我们可以再计算某个二维矩阵的值的时候顺便计算出来当前最长的公共子串的长度,即某个二维矩阵元素的值由record[i][j]=1演变为record[i][j]=1 +record[i-1][j-1],这样就避免了后续查找对角线长度的操作了。修改后的二维矩阵如下:
C++代码实现如下:
string getLCS(string str1, string str2) {vector<vector<int> > record(str1.length(), vector<int>(str2.length()));int maxLen = 0, maxEnd = 0;for(int i=0; i<static_cast<int>(str1.length()); ++i)for (int j = 0; j < static_cast<int>(str2.length()); ++j) {if (str1[i] == str2[j]) {if (i == 0 || j == 0) {record[i][j] = 1;}else {record[i][j] = record[i - 1][j - 1] + 1;}}else {record[i][j] = 0;}if (record[i][j] > maxLen) {maxLen = record[i][j];maxEnd = i; //若记录i,则最后获取LCS时是取str1的子串}}return str1.substr(maxEnd - maxLen + 1, maxLen);
}
2、返回最长公共子串
所谓动态规划思想就是认为大问题可以被拆分成小问题。它一般有3个性质:
- 1、无论是总问题还是子问题都存在最优解。
- 2、某问题只取决于它的子问题,和由它组成的问题没关系。
- 3、各子问题之间大多是相互关联的。
它每一阶段都有各个子问题的最优解,各子问题的最优解,会产生往往会重复计算,于是用一个表把它们存储起来。具体到本问题就是每一个字符的相同,然后逐步到原来问题的解。本问题的解是两个字符串的最长公共子串,那么它的子问题的解的极限是1个字符是否相同。在解集中每个单元格的左上角的单元格就是前面相邻的两个字符是否相同。并且如果该单元格对应的下标不同,那么单元格可以立刻被置0.否则它就应该加上左上角的单元格中的解的值。 应用动态规划算法以后时间复杂度变成了O(n^2)。
package com.company;public class Solution {static public String findLongestCommonSubstring0(String string0,String string1) {int[][] answerArray = new int[string0.length()][string1.length()];int maxSubstringLength = 0;int startLongestIndex = 0;for (int counter = 0;counter < string0.length();counter++) {for (int counter0 = 0;counter0 < string1.length();counter0++) {if (string0.charAt(counter) == string1.charAt(counter0)) {if (counter - 1 >= 0 && counter0 - 1 >= 0)answerArray[counter][counter0] = answerArray[counter - 1][counter0 - 1] + 1;else answerArray[counter][counter0] = 1;if (answerArray[counter][counter0] > maxSubstringLength) {maxSubstringLength = answerArray[counter][counter0];startLongestIndex = counter - maxSubstringLength + 1;}} else answerArray[counter][counter0] = 0;}}return string0.substring(startLongestIndex,startLongestIndex + maxSubstringLength);}
}
动态规划—最长公共子串相关推荐
- 动态规划--最长公共子串
找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.其实这又是一个序贯决策问题,可以用动态规划来求解.我们采用一个二维矩阵来记录中间的结果.这个二维矩阵怎么构造呢?"bab&quo ...
- 动态规划——最长公共子串,没有比这更通俗易懂的了
前言 动态规划是大厂的热门考点,其中最长公共子串与最长公共子序列这两道题出现得尤其频繁,这两道题其实有挺多变种,很适合考察侯选人对动态规划的掌握情况,今天我们就先来看看如何求解最长公共子串,图文并茂, ...
- 【动态规划】最长公共子序列与最长公共子串
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用
2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...
- 动态规划 dp03 最长公共子串问题 c代码
题目: 若序列Z是序列X的子序列,又是Y的子序列,则称Z是序列X与Y的公共子序列.例如序列"bcba"是序列"abcbdab"与"bdcaba&quo ...
- 动态规划之最长公共子串
一 问题引入 在生物学中,经常需要比较两个不同生物的DNA,一个DNA串由由一串称为碱基的的分子组成,碱基有鸟嘌呤,腺嘌呤,胞嘧啶,胸腺嘧啶四中,我们用英文字母的首字母表示四种碱基,那么DNA就是在有 ...
- 两个字符串的最长公共子序列长度_【面试】动态规划-之最长公共子序列、最长公共子串问题...
先来说明下什么是最长公共子序列,什么是是最长公共子串,举一个实际例子,myblogs与belong,最长公共子序列为blog(myblogs, belong),最长公共子串为lo(myblogs, b ...
- 动态规划算法之:最长公共子序列 最长公共子串(LCS)
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
- 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)
动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...
最新文章
- 谷歌将比特币现金汇率纳入货币信息搜索
- IE浏览器里无法运行脚本(script)常见的解决方法!
- 线结构光平面标定计算算子
- redis伪集群安装linux,redis伪集群搭建(亲测无坑)
- C# 任务栏的相关信息
- 这一大波电子“艺术”图,美翻了!
- jquery网页刷新后控件失效_jquery动态增减控件如何才能不刷新页面
- select * from where 三个条件_VBA学习笔记70: Select语句基础
- ES5实现ES6的一些方法-call,bind,is,promise
- 【unity3d study ---- 麦子学院】---------- unity3d常用组件及分析 ---------- 组件的生命周期...
- rce远程执行 0day漏洞 复测
- 创意火焰燃烧效果PS动作
- 微信公众号最佳实践 ( 10.2)回复QQ表情和Emoji表情
- 2022-2028全球多通道光纤旋转接头(FORJ)行业调研及趋势分析报告
- html旋转线条,html5 – 为什么我在移动浏览器上看到旋转的条纹?
- 安装kubectl失败:error: unpacking of archive failed on file /usr/bin/kubectl: cpio: rename
- 1.3 nest.js使用supertest单元测试及e2e测试
- 关系代数之专门的关系运算(选择、投影)
- 分享B2C来客推线上商城网站SEO优化方案
- toolbar wpf 按钮带文字_Tob设计:中台设计组件按钮