《算法导论》书中算法的实现
#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;
}