最长公共子串问题 动态规划
来源:互联网 发布:家用健身器材 知乎 编辑:程序博客网 时间:2024/06/05 00:12
1、问题描述:来源于《算法与数据结构题目最优解》左程云著
给定两个字符串str1和str2,返回两个字符串的最长公共子串,例如:str1="1AB2345CD",str2="12345EF",返回"2345"
2、问题分析
1)这个题目看起来和最长公共子序列很相似,在第一遍做的时候我也是做成了最长公共子序列,但是公共子串必须是连续的;
2)问题的关键在于状态的寻找,我觉得这个题目的状态不好找;最长公共子序列的状态dp[i][j]代表str1长度为i,str2长度为j时的子序列长度;本题目的状态dp[i][j]代表在必须把str1[i]和str2[j]当做公共子串最后一个字符的情况下,公共子串的长度。
3)上面的状态就代表如果str1[i]!=str2[j],那么就没法构成公共子串,那么此时dp[i][j]就为0;如果两者相等,那么dp[i][j]=dp[i-1][j-1]+1。
4)获得了最大的长度,然后再知道i或者j的值,就可以求出公共子串了。
3、下面是代码(以后会注意代码的模块化,方便阅读和理解)
#include<iostream>#include<vector>#include<string>using namespace std;int main() {int len1, len2;//两个字符串的长度int i, j;//辅助变量string str1, str2;getline(cin, str1);getline(cin, str2);len1 = str1.length();len2 = str2.length();vector<vector<int>>dp(len1, vector<int>(len2));//dp[i][j]表示必须以str1[i]和str2[j]结尾的公共子串的最大长度,也就是str1[i]必须等于str2[j]//计算公共子串的长度for (i = 0; i < len1; ++i) {if (str1[i] == str2[0])dp[i][0] = 1;elsedp[i][0] = 0;}for (j = 0; j < len2; ++j) {if (str2[j] == str1[0])dp[0][j] = 1;elsedp[0][j] = 0;}for (i = 1; i < len1; ++i) {for (j = 1; j < len2; ++j) {if (str1[i] != str2[j]) {dp[i][j] = 0;}else {dp[i][j] = dp[i - 1][j - 1] + 1;}}}//得出公共子串的最大长度,并且记录位置int pos, val = 0;for (i = 0; i < len1; ++i) {for (j = 0; j < len2; ++j) {if (val < dp[i][j]) {pos = i;val = dp[i][j];}}}//输出结果for (i = pos - val + 1; i <= pos; ++i) {cout << str1[i];}cout << endl;}
阅读全文
0 0
- 【动态规划】最长公共子串问题
- 【动态规划】最长公共子串问题
- 最长公共子串问题 动态规划
- 动态规划问题 最长公共子序列
- 动态规划:最长公共子序列问题
- 最长公共子序列问题--动态规划
- 动态规划-最长公共子序列问题
- 最长公共子序列问题 动态规划
- 最长公共子序列问题-动态规划
- 最长公共子序列&&最长公共子串---[动态规划]
- 动态规划-最长公共子序列、最长公共子串
- java 动态规划求解最长公共子序列&最长公共子串问题
- 动态规划之最长公共子序列、最长公共子串和背包问题
- 动态规划求解最长公共子串问题
- Java动态规划求解最长公共子串问题
- Java动态规划求解最长公共子串问题
- 算法回顾 - 动态规划 之 最长公共子串问题
- 动态规划-最长公共子串问题的实现
- 深度学习第一课 第四周 深层神经网络用python的实现
- leetcode 446. Arithmetic Slices II
- malloc、free、calloc、realloc的介绍
- maven-assembly-plugin 入门指南
- python2.7出现IOError: [Errno 5] Input/output error
- 最长公共子串问题 动态规划
- xgboost 用法讲解
- 2017-12-9
- 蓝桥杯训练:开灯游戏
- CCSv7使用指南连载4:Uniflash使用指南
- vbox虚拟机装centOS教程链接,以及自己搭建过程中遇到的一些坑
- 自适应控制---模型参考自适应控制(一)基于局部参数最优化的设计方法(MIT方案)
- Android Notification 你应该知道的事
- 决策树的基本知识