LCS模板,求长度,并记录子串

来源:互联网 发布:绝对争锋网络剧在线 编辑:程序博客网 时间:2024/06/05 01:59
 1 //LCS模板,求长度,并记录子串  2 //亦可使用注释掉的那些代码,但所用空间会变大 3 #include<iostream> 4 #include<cstring> 5 #include<cmath> 6 #include<cstdlib> 7 #include<cstdio> 8 using namespace std; 9 #define N 500510 11 int len[N][N];12 char str1[N],str2[N],str3[N];13 int k;14 15 int lcsLen(char *s1,int n1,char *s2,int n2)//求长度16 {17     for(int i=0;i<=n1;i++)18     len[i][0]=0;19     for(int j=0;j<=n2;j++)20     len[0][j]=0;21     for(int i=1;i<=n1;i++)22     {23         for(int j=1;j<=n2;j++)24         {25             if(s1[i-1]==s2[j-1])26             len[i][j]=len[i-1][j-1]+1;27             else28             len[i][j]=max(len[i-1][j],len[i][j-1]);29         }30     }31     return len[n1][n2];32 }33 34 void LCS(char *s1,char *s2,int i,int j)//递归求字串,存在tr3中35 {36     if(i==0||j==0)37     return ;38     if(s1[i-1]==s2[j-1])39     {40         LCS(s1,s2,i-1,j-1);41         str3[k++]=s1[i-1];42     }43     else if(len[i-1][j]>=len[i][j-1])44     LCS(s1,s2,i-1,j);45     else46     LCS(s1,s2,i,j-1);47 }48 49 void lcs(char *s1,int n1,char *s2,int n2)//求字串50 {51     memset(str3,0,sizeof(str3));52     lcsLen(s1,n1,s2,n2);53     k=0;54     LCS(s1,s2,n1,n2);55 }56 int main()57 {58     int n1,n2;59     while(cin >> str1 >> str2)60     {61         n1=strlen(str1);62         n2=strlen(str2);63         lcs(str1,n1,str2,n2);64         cout << str3 << endl;65         cout << lcsLen(str1,n1,str2,n2) << endl;66     }67     return 0;68 }

 

原创粉丝点击