最长公共子序列

给定两个字符串S1和S2,求两个字符串的最长公共子序列的长度。
输入样例
ABCD
AEBD
输出样例
3
解释
S1和S2的最长公共子序列为ABD,长度为3

思路

动态规划
LCS(m,n)LCS(m ,n)LCS(m,n)表示S1[0...m]S1[0...m]S1[0...m]和S2[0...n]S2[0...n]S2[0...n]的最长公共子序列的长度
S1[m]==S2[n]:LCS(m,n)=1+LCS(m−1,n−1)S1[m] == S2[n]: LCS(m, n) = 1 + LCS(m - 1, n - 1)S1[m]==S2[n]:LCS(m,n)=1+LCS(m−1,n−1)
S1[m]!=S2[n]:LCS(m,n)=max(LCS(m−1,n),LCS(m,n−1))S1[m] != S2[n]: LCS(m, n) = max(LCS(m - 1, n), LCS(m, n - 1))S1[m]!=S2[n]:LCS(m,n)=max(LCS(m−1,n),LCS(m,n−1))

代码

#include <iostream>
#include <vector>
#include <set>
using namespace std;class Solution{public:int lengthOflongestCommonSequence(string& str1, string& str2){int m = str1.length(), n = str2.length();if(m == 0 || n == 0)return 0;dp = vector<vector<int> >(m+1, vector<int>(n+1, 0));for(int i = 1; i < m+1; ++i){for(int j = 1; j < n+1; ++j){if(str1[i-1] == str2[j-1])dp[i][j] = dp[i-1][j-1] + 1;elsedp[i][j] = max(dp[i-1][j], dp[i][j-1]);}}return dp[m][n];}// 找出所有的LCS的序列// 这里形参lcs_str不可以为引用,这里需要每次调用lcs_str都重新生成一个对象void PrintAllLCS(string& str1, string& str2, int i, int j, string lcs_str){while(i > 0 && j > 0){if(str1[i-1] == str2[j-1]){lcs_str = str1[i-1] + lcs_str;--i;--j;}else{if(dp[i-1][j] > dp[i][j-1])  //向左走--i;else if(dp[i-1][j] < dp[i][j-1])  //向上走--j;//此时向上向右均为LCS的元素else{PrintAllLCS(str1, str2, i-1, j, lcs_str);PrintAllLCS(str1, str2, i, j-1, lcs_str);return;}}}all_lcs.insert(lcs_str);}vector<vector<int>> dp;set<string> all_lcs;
};int main()
{string s1 = "abcfbc";string s2 = "abfcab";Solution fir;string lcs_str;int res = fir.lengthOflongestCommonSequence(s1, s2);cout << res << endl;fir.PrintAllLCS(s1, s2, s1.length(), s2.length(), lcs_str);set<string>::iterator iter = fir.all_lcs.begin();while (iter != fir.all_lcs.end()) {cout << *iter++ << endl;}return 0;
}
/*
4
abcb
abfb
abfc
*/

最长公共子串

求两个字符串的最长公共子串,要求子串连续
输入例子:
bab
caba
输出例子:
2

思路

动态规划
当str1[i−1]==str2[j−1]str1[i-1] == str2[j-1]str1[i−1]==str2[j−1]时,dp[i][j]=dp[i−1][j−1]+1dp[i][j] = dp[i - 1][j - 1] + 1dp[i][j]=dp[i−1][j−1]+1;
只是当str1[i−1]!=str2[j−1]str1[i-1] != str2[j-1]str1[i−1]!=str2[j−1]时,dp[i][j]=0dp[i][j] = 0dp[i][j]=0。

代码

class Solution {public:int lengthOflongestCommonSubstring(string& str1, string& str2){int m = str1.size(), n = str2.size();int res = 0;vector<vector<int> > dp(m+1, vector<int>(n+1, 0));for(int i = 1; i <= m; ++i){for(int j = 1; j <= n; ++j){if(str1[i-1] == str2[j-1])dp[i][j] = dp[i-1][j-1] + 1;elsedp[i][j] = 0;if(res < dp[i][j])res = dp[i][j];}}return res;}
};

最长公共子序列c++实现相关推荐

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

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

  2. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  3. POJ 3080 多个串最长公共子序列

    求多个串最长公共子序列,字典序最小输出.枚举剪枝+kmp.比较简单,我用find直接查找16ms #include<iostream> #include<string> #in ...

  4. java实现最长连续子序列_最长公共子序列 ||

    问题:在 前一篇文章 最长公共子序列 | 的基础上要求将所有的最长公共子序列打印出来,因为最长公共子序列可能不只一种. 难点:输出一个最长公共子序列并不难,难点在于输出所有的最长公共子序列,我们需要在 ...

  5. 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence

    动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...

  6. 触类旁通,经典面试题最长公共子序列应该这么答

    作者 |  labuladong 来源 | labuladong(ID:labuladong) [导读]最长公共子序列(Longest Common Subsequence,简称 LCS)是一道非常经 ...

  7. 模板 - 最长上升子序列与最长公共子序列

    整理的算法模板合集: ACM模板 目录 1.最长上升子序列(LIS) 1.1树状数组优化O(nlogn)O(nlogn)O(nlogn) 2.最长公共子序列(LCS) 2.1转换成LIS优化O(nlo ...

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

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

  9. LCS最长公共子序列和LIS最长上升子序列——例题剖析

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

  10. 9.68最长公共子序列

    最长公共子序列 寻找两个字符串中的公共子串,可以不连续 #include<iostream> #include<cstring> using namespace std; ch ...

最新文章

  1. 离散数学--二元关系总结
  2. 阿里云华北区挂了。。。
  3. Mybatis通过colliection属性递归获取菜单树
  4. linux的memmap函数_linux /proc下的statm、maps、memmap 内存信息文件分析
  5. 粒子群优化算法Matlab实现(待逐步解释)
  6. angular组件--tips提示功能
  7. Java路径问题最终解决方案—可定位所有资源的相对路径寻址
  8. mysql 剔除不可见字符_机器视觉OCR字符检测在食品瓶盖上的应用
  9. 必读:Java Java
  10. (数据库系统概论|王珊)第十一章并发控制-第一节:并发控制概述
  11. Zookeeper之java api详解
  12. WPF DataGrid 对行中单元格的访问
  13. 【数学建模】基于matlab GUI模拟冰山运输系统(参数可调)【含Matlab源码 895期】
  14. CreateThread与_beginthread 内存泄漏的本质
  15. 获取网站url ico小图标
  16. 官宣 .NET RC 2
  17. 20220601超简单百度地图街景图片爬取+绿视率计算
  18. Real-Time Loop Closure in 2D LIDAR SLAM 翻译和总结(一)
  19. ApiView 的使用
  20. 初心始终 殊途同归 | SCTF同期个人能力认证考核专场报名开启

热门文章

  1. 微信小程序 Video 视频太小怎么办
  2. 5.4结构型模式—————装饰模式
  3. Ajax 同步与异步
  4. echarts在地图上标记县
  5. Java 获取当前日期和时间
  6. ES6基本数据类型总结
  7. 实现页面滚动背景图片不动的效果
  8. 魔兽世界巫妖王架设教程-娱乐版
  9. 利用POI读取excel文件(java)
  10. gojs 2.2.14 去除水印