动态规划解决最长公共子序列和最长公共子串
来源:互联网 发布:盲打高手打飞字 源码 编辑:程序博客网 时间:2024/05/17 04:58
问题描述
找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。
而找两个字符串的最长公共子序列,只要求子序列的字符都在原字符串中出现且保持相对顺序不对
解决思路
动态规划
1.最长公共子串,
状态转移方程
那么最终的最长公共子串为
2.最长公共子序列,
状态转移方程
那么最终的最长公共子序列为
如果没看懂直接看代码就懂了。。。
class Solution { public: string LCS(const string &a,const string &b) { int m=a.size(),n=b.size(); vector<vector<string>> res(m+1,vector<string>(n+1)); if(m==0||n==0)return string(""); string best; for(int i=1;i<=m;++i) for(int j=1;j<=n;++j){ if(a[i-1]==b[j-1]){ string tmp; tmp.push_back(a[i-1]); if(i>1&&j>1&&a[i-2]==b[j-2])res[i][j]=res[i-1][j-1]+tmp; else res[i][j]=tmp; } if(best.size()<res[i][j].size())best=res[i][j]; } return best; } string LCS2(const string &a,const string &b) { int m=a.size(),n=b.size(); vector<vector<string>> res(m+1,vector<string>(n+1)); if(m==0||n==0)return string(""); for(int i=1;i<=m;++i) for(int j=1;j<=n;++j){ if(a[i-1]==b[j-1]){ string tmp; tmp.push_back(a[i-1]); res[i][j]=res[i-1][j-1]+tmp; } else { if(res[i][j-1].size()<res[i-1][j].size()) res[i][j]=res[i-1][j]; else res[i][j]=res[i][j-1]; } } return res[m][n]; }};
case0:
hellomygod子串1
hellogod子串2
hello最长公共子串
hellogod最长公共子序列
0 0
- 动态规划--最长公共子序列和公共子串
- 动态规划解决最长公共子序列和最长公共子串
- 动态规划解决最长公共子序列和最长公共子串
- 最长公共子序列&&最长公共子串---[动态规划]
- 动态规划-最长公共子序列、最长公共子串
- 动态规划解决最长公共子序列
- 动态规划解决最长公共子序列
- 动态规划解决最长公共子序列和最长公共子字符串问题 java实现
- 用动态规划求解最长公共子序列和最长公共子串
- 最长公共子序列和最长公共子串(动态规划)总结
- 动态规划之LCS最长公共子序列和最长公共子串
- 动态规划之最长公共子序列、最长公共子串和背包问题
- 动态规划 最长公共子序列LCS、最长公共连续子串、最长重复子串
- 动态规划之最长公共子序列和最长公共字串,最大子序列和
- 动态规划之最长递增子序列 最长不重复子串 最长公共子序列
- 动态规划之最长递增子序列 最长不重复子串 最长公共子序列
- 动态规划之最长公共子序列
- 动态规划 ------- 最长公共子序列
- ios进阶--Autolayout 之第三方框架--Masonry
- CollctionView添加头部视图,不是sectionHeader
- 《Ted:记忆的虚构》——Elizabeth Loftus(有感)
- getExtras()方法
- android 源码大全总结
- 动态规划解决最长公共子序列和最长公共子串
- 关于wpf 构造函数执行符合指定的绑定约束的调用时引发了异常
- mac下android环境搭建笔记(android studio)
- Kafka学习整理八(topic管理)
- js中如何快速获取数组中的最大值最小值
- hadoop问题汇总
- (转)JS、ActiveXObject、Scripting.FileSystemObject
- iphone6P上字体变大iOS适配ios6P
- c++函数重载