最长公共字串(LCS)C++代码(动态规划实现)
时间复杂度: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++代码(动态规划实现)相关推荐
- 求两个字符串的最长公共字串(连续)
题目描述: 输入两个字符串,求其的最长的公共的字串,这与最长公共子序列不一样 输出两字符串的最长公共字串 思路一: 从字符串A开始遍历,同时遍历字符串A,找到第一个与当前字符串A相同的字符,此时记下当 ...
- 后缀数组以及利用后缀数组求取最长公共字串
后缀树组是一个字符串的所有后缀的排序数组.后缀是指从某个位置 i 开始到整个串末尾结束的一个子串.字符串 r 的从 第 i 个字符开始的后缀表示为 Suffix(i) ,也就是Suffix(i)=r[ ...
- 最字头之二:最长公共字串
除代码外,其他文字部分均为直接转载.代码为参考. 文章作者: Yx.Ac 文章来源: 勇幸|Thinking ( http://www.ahathinking.com) 转载请注明,谢谢合作. ...
- 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...
问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...
- 最长公共子序列(LCS)算法
一.最长公共字串与最长公共子序列 最长公共子串(Longest Common Substirng) 子串是串的一个连续的部分,子串中字符的位置必须连续. 例如:有两个字符串ABCBDAB 和 BDCA ...
- 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我)
目录 最长公共子序列(LCS)问题 1.朴素做法 O(n2)O(n^2)O(n2) 2.转换成LIS优化O(nlogn)O(nlogn)O(nlogn) 3.P2758 编辑距离 最长公共子序列(LC ...
- 程序员的算法课(6)-最长公共子序列(LCS)
上一节我们讲了动态规划,我们也知道,动态规划对于子问题重叠的情况特别有效,因为它将子问题的解保存在存储空间中,当需要某个子问题的解时,直接取值即可,从而避免重复计算! 这一节我们来解决一个问题,就是最 ...
- 最长公共子序列问题——LCS算法
最长公共子序列问题--LCS算法 问题描述: 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).比如两个串为:abcicba abdkscabab是两个串的子序列,abc也是,a ...
最新文章
- java最全人名数组_java 里有两个方法 第一个方法定义一个数组 每个数组都是一个学生类 每个学生有姓名 学号 年龄...
- python 读帧和绘图的区别
- SOLID 设计原则
- c判断char数组是否为空_你学过数组,那你知道柔性数组吗?
- Python 考试练习
- postgresql分页用法_postgresql分页数据重复问题的深入理解
- SQL Server 2017安装错误:Polybase要求安装Oracle JRE 7更新51或更高版本的两种解决方法
- ss1111111111111111111111111111111111111111
- 用友T+、U8、NC系列,致远OA产品二次开发
- 如何修改Tomcat的默认主页
- 西湖论剑2020-BrokenSystems
- ipv6环境搭建来测试
- Xilinx FPGA 初探内部时钟管理
- blender 制作城市建筑模型
- CSS颜色代码大全及a标签超链接颜色改变
- c语言求两个数的最小公倍数辗转相除法,C语言辗转相除法求2个数的最小公约数...
- 计算机素养的论文,核心素养下计算机程序设计教学探索
- 一招解决bat文件执行时cmd命令窗口闪退问题
- 代谢组学——最接近生物表型的组学
- 一个体育生的编程之路(一)
热门文章
- 计算机整个文稿应用回顾主题,IT活动|格创计算机协会精彩活动回顾
- idea plugin加载不出来
- 计算机毕业设计-基于SSM的企业ERP报销系统-JavaWeb企业ERP报销系统
- cocos2d-x + Lua + win10 + VS2017 环境搭建
- 如何恢复录音删除的录音文件_录音棚如何选择合适的麦克风
- 88820-71-7,3-Chloropropydimethylvinylsilane,Vinyl(3-chloropropyl)dimethylsilane,3-氯丙基二甲基乙烯基硅烷的物理特性
- vegas使用技巧——vegas如何导入音频视频素材?
- Es6中的set和map
- Yunxion资产监测设备帮助外贸企业实时把握国际货物运输状态
- 台达服务器过流维修,台达变频器过流(OC)故障的原因及对策