编程之美3.3——类似——两个字符串的最长公共子序列(LCS)
2015-04-16 22:39
387 查看
#include <iostream> #include <algorithm> #include <string> using namespace std; #define MAXN 10001 char A[MAXN]; char B[MAXN]; int dp[MAXN][MAXN]; // 设Z为A和B的最长公共子序列,dp[i][j]表示A从位置i开始的后缀与 // B从位置j开始的后缀的最长公共子序列Z从位置k开始的后缀的长度 void fun1() { cin>>A>>B; int i, j, m, n; n = strlen(A); m = strlen(B); // 初始化,若一个序列为空,则最长子序列肯定为0 for (i=0; i<=n; i++) dp[i][m] = 0; for (j=0; j<=m; j++) dp [j] = 0; for(i=n-1; i>=0; i--) for(j=m-1; j>=0; j--) { if (A[i] == B[j]) // 若相等,则zk=Ai=Bj且A从位置i+1开始的后缀与B从位置j+1开始的后缀 // 的最长公共子序列是Z从位置k+1开始的后缀 dp[i][j]=dp[i+1][j+1]+1; else // 若不相等,则取两个最长公共子序列中长度较大的那个 dp[i][j]=max(dp[i][j+1], dp[i+1][j]); } for(i=0;i<=n;i++) { for(j=0;j<=m;j++) printf("%d ",dp[i][j]); printf("\n"); } printf("%d\n", dp[0][0]); } int CalculateLcs(string s1,int p1E,string s2,int p2E) { if(p1E<0||p2E<0) return 0; if(s1[p1E]==s2[p2E]) { return CalculateLcs(s1,p1E-1,s2,p2E-1)+1; } else { return max(CalculateLcs(s1,p1E,s2,p2E-1),CalculateLcs(s1,p1E-1,s2,p2E)); } } string Lcs(string s1,int p1E,string s2,int p2E) { if(p1E<0||p2E<0) return ""; if(s1[p1E]==s2[p2E]) { return Lcs(s1,p1E-1,s2,p2E-1)+s1[p1E]; } else { string str1 = Lcs(s1,p1E,s2,p2E-1); string str2 = Lcs(s1,p1E-1,s2,p2E); return (str1.length()>str2.length())?str1:str2; } } int main() { string s1,s2; cin>>s1>>s2; //计算最长公共子序列长度 cout<<CalculateLcs(s1,s1.length()-1,s2,s2.length()-1)<<endl; //计算最长公共子序列 cout<<Lcs(s1,s1.length()-1,s2,s2.length()-1); return 0; }参考:http://blog.csdn.net/linyunzju/article/details/7747718
相关文章推荐
- 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。C实现
- 每日一题(86) - 计算两个字符串的最长公共子序列(LCS)
- 计算字符串的相似度--编程之美3.3
- 51nod oj 1183 编辑距离 【求一个字符串到另一个字符串的最小操作次数【类似LCS】】
- c++ 连接两个字符串实现代码 实现类似strcat功能(转)
- 计算字符串的相似度--编程之美3.3
- Levenshtein Distance + LCS 算法计算两个字符串的相似度
- 编程两个小问题,C语言中如何读取一行字符串的问题和VS2008中调试出错一个问题
- 求两个字符串的最长公共子序列
- 计算字符串的相似度--编程之美3.3
- 计算字符串的相似度--编程之美3.3
- 小白算法学习:求解两个字符串的最长公共子序列
- 动态规划求两个字符串的连续最长公共子序列
- 动态规划———求两个字符串的最长公共子序列!
- 求三个字符串的最长公共子序列LCS(A,B,C)
- JAVA代码—算法基础:求两个字符串的最长公共子序列问题
- 编程之美3.3 计算两个字符串的相似度
- 程序员编程艺术第十一章:最长公共子序列(LCS)问题
- dp---两个字符串最长公共子序列
- LCS两个字符串最长公共子串