最长公共子序列,子串(打印一个、打印多个)
来源:互联网 发布:知金教育信誉度怎么样 编辑:程序博客网 时间:2024/06/05 19:16
最长公共子序列(输出最大长度与多个不重复子序列)
#include<iostream>#include<string>#include<algorithm>#include<vector>using namespace std;string printOne(string s1, string s2, int **dp) { string ans = ""; int t1 = s1.length(); int t2 = s2.length(); while(t1 > 0 && t2 > 0) { if(s1[t1-1] == s2[t2-1]) { ans = s1[t1-1] + ans; t1--; t2--; }else if(dp[t1-1][t2] < dp[t1][t2-1]) { t2--; }else { t1--; } } return ans;}void printMulti(string s1, string s2, int **dp, int t1, int t2, vector<string>& vt_str, string str) { if(t1 <= 0 || t2 <= 0) { if(find(vt_str.begin(), vt_str.end(), str) == vt_str.end()) vt_str.push_back(str); return; } if(s1[t1-1] == s2[t2-1]) { printMulti(s1, s2, dp, t1-1, t2-1, vt_str, s1[t1-1]+str); }else if(dp[t1-1][t2] == dp[t1][t2-1]) { printMulti(s1, s2, dp, t1-1, t2, vt_str, str); printMulti(s1, s2, dp, t1, t2-1, vt_str, str); }else if(dp[t1-1][t2] < dp[t1][t2-1]) { printMulti(s1, s2, dp, t1, t2-1, vt_str, str); }else { printMulti(s1, s2, dp, t1-1, t2, vt_str, str); }}int LCS(string s1, string s2) { int len1 = s1.length(); int len2 = s2.length(); int **dp = new int*[len1+1]; for(int i = 0; i <= len1; i++) { dp[i] = new int[len2+1]; } for(int i = 0; i <= len1; i++) dp[i][0] = 0; for(int i = 0; i <= len2; i++) dp[0][i] = 0; for(int i = 1; i <= len1; i++) { for(int j = 1; j <= len2; j++) { if(s1[i-1] == s2[j-1]) { dp[i][j] = dp[i-1][j-1] + 1; }else { dp[i][j] = max(dp[i-1][j], dp[i][j-1]); } } } int ans = dp[len1][len2]; string str = printOne(s1, s2, dp); cout<<"str = "<<str<<endl; vector<string> vt_str; printMulti(s1, s2, dp, len1, len2, vt_str, ""); for(int i = 0; i < vt_str.size(); i++) cout<<vt_str[i]<<endl; for(int i = 0; i <= len1; i++) delete[] dp[i]; delete[] dp; return ans;}int main() { string s1, s2; while(cin>>s1>>s2) { cout<<LCS(s1, s2)<<endl; }}
#include<iostream>#include<algorithm>#include<string>#include<vector>using namespace std;int LCS(string s1, string s2) { int len1, len2; len1 = s1.length(); len2 = s2.length(); int *d = new int[len2+1]; for(int i = 0; i <= len2; i++) d[i] = 0; vector<int> vt; int max_len = 0; for(int i = 1; i <= len1; i++) { int cur_max = 0; for(int j = len2; j > 0; j--) { if(s1[i-1] == s2[j-1]) d[j] = d[j-1] + 1; else d[j] = 0; cur_max = max(cur_max, d[j]); } if(cur_max > max_len) { max_len = cur_max; vt.clear(); } if(cur_max >= max_len) vt.push_back(i); } vector<string> vt_str; for(int i = 0; i < vt.size(); i++) { string s = s1.substr(vt[i]-max_len, max_len); if(find(vt_str.begin(), vt_str.end(), s) == vt_str.end()) vt_str.push_back(s); } for(int i = 0; i < vt_str.size(); i++) cout<<vt_str[i]<<endl; delete[] d; return max_len;}int main() { string s1, s2; while(cin>>s1>>s2) { cout<<LCS(s1, s2)<<endl; }}
0 0
- 最长公共子序列,子串(打印一个、打印多个)
- 最长公共子序列(可打印所有子序列)
- 最长公共子序列与最长公共子串以及他们的打印(dp)
- 最长公共子序列+打印路径
- 最长公共子序列打印路径
- 最长公共子序列+元素打印
- 最长公共子序列(可打印LCS)
- 打印最长公共子串【LCS】【回溯】
- Compromise(最长公共子串变形,打印路径)
- 最长公共子序列-jobdu-1402(附带打印)
- UVA Compromise(最长公共子序列 + 打印路径)
- 最长公共子序列 LCS 【长度及打印】
- Codeforces10D(最长公共上升子序列+路径打印)很水的最长上升公共子序列+路径打印
- LCS(最长公共子序列)dp模板,长度和打印子序列
- UVA DP入门专题(二)最长公共子序列 打印方法
- HDU 1503 最长公共子序列问题---加强版(路径打印)dp
- 51nod 1006 最长公共子序列Lcs(打印路径)
- 最长公共子串、最长公共子序列、最长递增子序列、最长回文子串
- make install
- C# 警告错误问题处理笔记整理(Code Analysis for Managed Code Warnings)
- asp.net C#对xml文档创建 修改 删除 查找
- Tensorflow和sklearn/scipy 安装冲突问题及解决 ——CentOS
- cmake --version
- 最长公共子序列,子串(打印一个、打印多个)
- 第十、十一周阅读程序 继承和派生(4)
- 时钟和滴答
- iOS状态栏默认文字颜色修改为白色
- Android 开发注意事项
- 桥接模式
- 二分查找(折半查找)
- java中的main方法为什么要用static
- HADOOP- BUILD FAILURE