标签:comm length return code enc turn seq std isp
最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。
我们可以得到其中公共子串:B C B A 和 B D A B。
#include <iostream> #define N 1000 using namespace std; //c[i][j]存储str1[1...i]与str2[1...j]的最长公共子序列的长度 int c[N][N]; //flag[i][j]标记是那种子问题 //flag[i][j]==0为str1[i]==str2[j] //flag[i][j]==1为c[i-1][j]>=s[i][j-1] //flag[i][j]==-1为c[i-1][j]<s[i][j-1] int flag[N][N]; int getLCSlength(string str1, string str2) { int len1 = str1.size(); int len2 = str2.size(); for (int i = 0; i <= len1; i++) { for (int j = 0; j <= len2; j++) { if (i == 0 || j == 0) c[i][j] = 0; else if (str1[i - 1] == str2[j - 1]) { c[i][j] = c[i - 1][j - 1] + 1; flag[i][j] = 0; } else if (c[i - 1][j] >= c[i][j - 1]){ c[i][j] = c[i - 1][j]; flag[i][j] = 1; } else{ c[i][j] = c[i][j - 1]; flag[i][j] = -1; } } } return c[len1][len2]; } void getLCS(string s1, string s2,int len,string &lcs) { int i = s1.size(); int j = s2.size(); while(i&&j) { if(flag[i][j]==0) { lcs[--len] = s1[i-1]; i--; j--; } else if(flag[i][j]==1) //往上 i--; else if(flag[i][j]==-1)//往左 j--; } } int main() { string str1,str2,lcs; cout<<"请输入字符串1:"<<endl; cin>>str1; cout<<"请输入字符串2:"<<endl; cin>>str2; int lcsLen = getLCSlength(str1,str2); cout<<"最长公共子序列长度:"<<lcsLen<<endl; getLCS(str1,str2,lcsLen,lcs); cout<<"最长公共子序列为:"; for(int i=0;i<lcsLen;i++) cout<<lcs[i]; return 0; }
标签:comm length return code enc turn seq std isp
原文地址:http://www.cnblogs.com/home123/p/7450549.html