首页 > 代码库 > LCS (Longest Common Subsequence)
LCS (Longest Common Subsequence)
LCS是两个序列相似性的一种度量方法;
若序列s1:2,5,7,9,3,1,2
s2:3,5,3,2,8
则LCS为:5,3,2
思路可参考:http://www.csie.ntnu.edu.tw/~u91029/LongestCommonSubsequence.html
具体代码实现为:
1 #include<iostream> 2 using namespace std; 3 4 int s1[7+1]={0,2,5,7,9,3,1,2}; 5 int s2[7+1]={0,3,5,3,2,8}; 6 const int s1_length=8; 7 const int s2_length=6; 8 const int LEFT=1; 9 const int UP=2;10 const int UP_LEFT=3;11 const int LEFTORUP=4;12 13 int arr[7+1][5+1]={0};14 int pre[7+1][5+1]={0};15 16 void LCS();17 void print_LCS(int i,int j);18 19 int main()20 {21 cout<<"the LCS of the sequence is:";22 LCS();23 return 0;24 }25 26 void LCS()27 {28 for(int i=0;i<s2_length;++i)29 arr[0][i]=0;30 for(int i=0;i<s1_length;++i)31 arr[i][0]=0;32 33 for(int i=1;i<s1_length;++i)34 for(int j=1;j<s2_length;++j)35 if(s1[i]==s2[j])36 {37 arr[i][j]=arr[i-1][j-1]+1;38 pre[i][j]=UP_LEFT;39 }40 else41 {42 if(arr[i-1][j]==arr[i][j-1])43 {44 arr[i][j]=arr[i-1][j];45 pre[i][j]=LEFTORUP;46 }47 else if(arr[i-1][j]>arr[i][j-1])48 {49 arr[i][j]=arr[i-1][j];50 pre[i][j]=UP;51 }52 else53 {54 arr[i][j]=arr[i][j-1];55 pre[i][j]=LEFT;56 }57 }58 59 print_LCS(s1_length-1,s2_length-1);60 }61 62 void print_LCS(int i,int j)63 {64 if(i==0||j==0)65 return;66 67 if(pre[i][j]==UP_LEFT)68 {69 cout<<s1[i]<<‘\t‘;70 print_LCS(i-1,j-1);71 }72 else if(pre[i][j]==UP)73 print_LCS(i-1,j);74 else if(pre[i][j]==LEFT)75 print_LCS(i,j-1);76 }
以上情况中两个序列只存在一个LCS,但是若存在多个LCS应该怎么解决呢?
若序列s1:2,5,7,9,3,1,2
s2:3,5,3,2,8,7,9
则LCS为:5,3,2; 2,7,9; 5,7,9
以上两个表格为算法的思路,上面表格为顺序思路,arr[i][j]表示s1(1:i) s2(1:j)两个序列的LCS长度,下面表格为回溯思路,从右下角开始根据方向得到LCS,其中数字意义为:
LEFT=1;
UP=2;
UP_LEFT=3;
LEFTORUP=4;顺序时由上面或左面数字得到(区别于只有一个LCS存在),目的在于回溯时可以得到序列所有的LCS,代码还没有实现。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。