C++ 最长公共子序列
2014-05-07 22:39
162 查看
//LCS #include<iostream> #include<string> using namespace std; void LCS_Length(string x,string y,int (*c)[100],int (*b)[100]) { int m,n; m=x.length(); n=x.length(); int i,j; //如果i或j等于0则c[i][j]=0; for(i=1;i<=m;i++) { c[i][0]=0; } for(i=1;i<=n;i++) { c[0][i]=0; } //遍历两个字符串,依次标记c[i][j],c[i][j]标记了从x的开始到第i个元素与从 //y开始到第j个元素中LCS的长度 //数组b用来标记最长公共子串所要走的路线,该路线为两个字符串组成的矩阵中的对应的字母 for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(x[i-1]==y[j-1]) { c[i][j]=c[i-1][j-1]+1; //代替箭头指向左上 b[i][j]=1; } else { if(c[i][j-1]>=c[i-1][j]) { c[i][j]=c[i][j-1]; //代替箭头指左 b[i][j]=2; } else { c[i][j]=c[i-1][j]; //代替箭头指向上 b[i][j]=3; } } } } } void PrintAnswer(string x,int(*b)[100],int i,int j) { if(i==0||j==0) { return ; } else { if(b[i][j]==1) { PrintAnswer(x,b,i-1,j-1); cout<<x[i-1]<<" "; } else if(b[i][j]==2) { PrintAnswer(x,b,i,j-1); } else { PrintAnswer(x,b,i-1,j); } } } int main() { string x="abcbda"; string y="bdcaba"; int c[100][100]={0}; int b[100][100]={0}; LCS_Length(x,y,c,b); cout<<"the LCS is: "<<c[x.length()][y.length()]<<endl; PrintAnswer(x,b,x.length(),y.length()); return 0; }
—————————————————————————————————
本文原创自Slience的csdn技术博客。
本博客所有原创文章请以链接形式注明出处。
欢迎关注本技术博客,本博客的文章会不定期更新。
大多数人想要改造这个世界,但却罕有人想改造自己。
世上没有绝望的处境,只有对处境绝望的人。
————By slience
—————————————————————————————————
相关文章推荐
- [C++]学习字符串最长公共子序列(非连续)算法
- C++ 最长公共子序列
- 最长公共子序列问题(c++)-动态规划
- [C++]学习字符串最长公共子序列(非连续)算法
- C++求解汉字字符串的最长公共子序列 动态规划
- C++之最长公共子序列(21)---《那些奇怪的算法》
- C++实现最长公共子序列和最长公共子串
- 最长公共子序列(LCS)的C++实现
- 最长公共子序列的C++实现代码
- 求两个字符串最长公共子序列的算法优化(C++实现)
- C++实现最长公共子序列和最长公共子串
- 算法学习 - 最长公共子序列(LCS)C++实现
- C++ 动态规划-LCS最长公共子序列
- C++实现动态规划求解最长公共子序列
- C++实现最长公共子序列和最长公共子串
- 最长公共子序列LCS(C++实现)
- C++实现最长公共子序列LCS问题
- 动态规划之最长公共子序列问题 C++实现
- 最长上升子序列与最长公共子序列 C/C++
- LCS最长公共子序列C++代码实现