c++实现最长公共子序列

来源:互联网 发布:好源码分享 编辑:程序博客网 时间:2024/05/01 01:50

《算法导论》书中算法的实现

#include<iostream>#include<string>using std::string;using std::cout;using std::cin;void Print_LCS(int flag[],string s1,int i,int j,int n){      if(i==0||j==0)         return;      if(flag[i*n+j]==1)     {         Print_LCS(flag,s1,i-1,j-1,n);         cout<<s1[i-1];     }      else if(flag[i*n+j]==2)     {          Print_LCS(flag,s1,i-1,j,n);      }     else     {        Print_LCS(flag,s1,i,j-1,n);     }}int LCS_Length(string s1,string s2){    const size_t m=s1.length();    const size_t n=s2.length();    int* p=new int[(m+1)*(n+1)]();    int* flag=new int[(m+1)*(n+1)]();    for(int i=1;i!=m+1;++i)    {          for(int j=1;j!=n+1;++j )         {            if(s1[i-1]==s2[j-1])           {                p[i*(n+1)+j]=p[(i-1)*(n+1)+j-1]+1;                flag[i*(n+1)+j]=1;            }            else if(p[(i-1)*(n+1)+j]>=p[i*(n+1)+j-1])           {                p[i*(n+1)+j]=p[(i-1)*(n+1)+j];                 flag[i*(n+1)+j]=2;           }           else           {             p[i*(n+1)+j]=p[i*(n+1)+j-1];            flag[i*(n+1)+j]=3;          }        }     }         Print_LCS(flag,s1,m,n,n+1);        delete [] p;        delete[] flag;      return 0;}int main(){    string s1="ABCBDAB";    string s2="BDCABA";    LCS_Length(s1,s2);    cin.get();    return 0;}


原创粉丝点击