时间复杂度:O(n1)*O(n2),n1和n2为两个字符串的长度
注释掉#define TEST取消随机输入模式

#define TEST
#include<ctime>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
string dp(string a, string b)
{string res;int n1 = a.size(), n2 = b.size();int** map = new int*[n1];int** ch = new int* [n1];for (int i = 0; i < n1; ++i)map[i] = new int[n2], ch[i] = new int[n2];for (int i = 0; i < n1; ++i)for (int j = 0; j < n2; ++j)if (a[i] == b[j]){if (!i || !j)map[i][j] = 1;else map[i][j] = map[i - 1][j - 1] + 1;ch[i][j] = 1;}else{if (!i && !j)map[i][j] = 0, ch[i][j] = 2;if (!i)map[i][j] = map[i][j - 1], ch[i][j] = 3;else if (!j)map[i][j] = map[i - 1][j], ch[i][j] = 2;else if (map[i - 1][j] >= map[i][j - 1]){map[i][j] = map[i - 1][j];ch[i][j] = 2;}else{map[i][j] = map[i][j - 1];ch[i][j] = 3;}}int i = n1 - 1, j = n2 - 1;while (i >= 0 && j >= 0){if (ch[i][j] == 1){res = a[i] + res;--i, --j;}else if (ch[i][j] == 2)--i;else --j;}int maxi = 0;for (int i = 0; i < n1; ++i)for (int j = 0; j < n2; ++j)maxi = max(maxi, map[i][j]);cout <<"Length of LCS is:"<< maxi << endl;if (n1 <= 10 && n2 <= 10){cout << "The direction matrix is:(1 for up and left, 2 for up and 3 for up)\n";for (int i = 0; i < n1; ++i) { for (int j = 0; j < n2; ++j)cout << ch[i][j] << ' '; cout << endl; }}return res;
}
int main()
{string a, b;
#ifdef TESTcout << "PLS input the lengths of the two strings: \n";int n1, n2;cin >> n1 >> n2;srand(time(0));for (int i = 0; i < n1; ++i)a += rand() % 26 + 'a';for (int j = 0; j < n2; ++j)b += rand() % 26 + 'a';cout << a << endl << b << endl;
#elsecout << "PLS input the two strings: \n";cin >> a >> b;
#endif // TESTcout << "LCS is " << dp(a, b);return 0;
}

最长公共字串(LCS)C++代码(动态规划实现)相关推荐

  1. 求两个字符串的最长公共字串(连续)

    题目描述: 输入两个字符串,求其的最长的公共的字串,这与最长公共子序列不一样 输出两字符串的最长公共字串 思路一: 从字符串A开始遍历,同时遍历字符串A,找到第一个与当前字符串A相同的字符,此时记下当 ...

  2. 后缀数组以及利用后缀数组求取最长公共字串

    后缀树组是一个字符串的所有后缀的排序数组.后缀是指从某个位置 i 开始到整个串末尾结束的一个子串.字符串 r 的从 第 i 个字符开始的后缀表示为 Suffix(i) ,也就是Suffix(i)=r[ ...

  3. 最字头之二:最长公共字串

    除代码外,其他文字部分均为直接转载.代码为参考. 文章作者: Yx.Ac   文章来源: 勇幸|Thinking ( http://www.ahathinking.com)   转载请注明,谢谢合作. ...

  4. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...

    问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...

  5. 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串

    1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...

  6. 最长公共子序列(LCS)算法

    一.最长公共字串与最长公共子序列 最长公共子串(Longest Common Substirng) 子串是串的一个连续的部分,子串中字符的位置必须连续. 例如:有两个字符串ABCBDAB 和 BDCA ...

  7. 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我)

    目录 最长公共子序列(LCS)问题 1.朴素做法 O(n2)O(n^2)O(n2) 2.转换成LIS优化O(nlogn)O(nlogn)O(nlogn) 3.P2758 编辑距离 最长公共子序列(LC ...

  8. 程序员的算法课(6)-最长公共子序列(LCS)

    上一节我们讲了动态规划,我们也知道,动态规划对于子问题重叠的情况特别有效,因为它将子问题的解保存在存储空间中,当需要某个子问题的解时,直接取值即可,从而避免重复计算! 这一节我们来解决一个问题,就是最 ...

  9. 最长公共子序列问题——LCS算法

    最长公共子序列问题--LCS算法 问题描述: 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).比如两个串为:abcicba abdkscabab是两个串的子序列,abc也是,a ...

最新文章

  1. java最全人名数组_java 里有两个方法 第一个方法定义一个数组 每个数组都是一个学生类 每个学生有姓名 学号 年龄...
  2. python 读帧和绘图的区别
  3. SOLID 设计原则
  4. c判断char数组是否为空_你学过数组,那你知道柔性数组吗?
  5. Python 考试练习
  6. postgresql分页用法_postgresql分页数据重复问题的深入理解
  7. SQL Server 2017安装错误:Polybase要求安装Oracle JRE 7更新51或更高版本的两种解决方法
  8. ss1111111111111111111111111111111111111111
  9. 用友T+、U8、NC系列,致远OA产品二次开发
  10. 如何修改Tomcat的默认主页
  11. 西湖论剑2020-BrokenSystems
  12. ipv6环境搭建来测试
  13. Xilinx FPGA 初探内部时钟管理
  14. blender 制作城市建筑模型
  15. CSS颜色代码大全及a标签超链接颜色改变
  16. c语言求两个数的最小公倍数辗转相除法,C语言辗转相除法求2个数的最小公约数...
  17. 计算机素养的论文,核心素养下计算机程序设计教学探索
  18. 一招解决bat文件执行时cmd命令窗口闪退问题
  19. 代谢组学——最接近生物表型的组学
  20. 一个体育生的编程之路(一)

热门文章

  1. 计算机整个文稿应用回顾主题,IT活动|格创计算机协会精彩活动回顾
  2. idea plugin加载不出来
  3. 计算机毕业设计-基于SSM的企业ERP报销系统-JavaWeb企业ERP报销系统
  4. cocos2d-x + Lua + win10 + VS2017 环境搭建
  5. 如何恢复录音删除的录音文件_录音棚如何选择合适的麦克风
  6. 88820-71-7,3-Chloropropydimethylvinylsilane,Vinyl(3-chloropropyl)dimethylsilane,3-氯丙基二甲基乙烯基硅烷的物理特性
  7. vegas使用技巧——vegas如何导入音频视频素材?
  8. Es6中的set和map
  9. Yunxion资产监测设备帮助外贸企业实时把握国际货物运输状态
  10. 台达服务器过流维修,台达变频器过流(OC)故障的原因及对策