最长公共子串定义是,一个数列z分别是已知数列的子串(子串并不一定是连续的列,而是从该列中除去了几个要素后的列),而且,如果在满足该条件的所有列中为最长,则z是最长公共子串LCS (longestccs ) 公共子串是指要求连续的子串,有些则不是,在此要注意区分。 以下是完整的实现代码。
#include iostream
using namespace std;
voidLCS_length(char*x,char *y,int **b,int m,int n ) ) ) ) ) ) ) ) ) ) ) ) ) ) 652
{
//c[i][j]表示x[i-1]、y[j-1]之前的公共子序列的长度,I表示x阵列的前进,j表示y阵列的前进
没有用c[i][j]表示x[i],因为y[j]之前的公共子序列的长度必须使用c[0][0]表示没有公共子序列,
//也就是说,由于c[0][0]总是0,所以c排列的最大下标为c[m 1][n 1]
int **c;
c=new int*[m 1];
for(intI=0; im 1; I )
c[i]=new int[n 1];
for(intI=0; im 1; I )
c[i][0]=0;
for(intI=0; 合1; I )
c[0][i]=0;
for(intI=1; i=m; I )
{
for(intj=1; j=n; j )
{
if(x[I-1]==y[j-1] ) /找到了通用的“字符”
{
c[i][j]=c[i-1][j-1] 1; //公共子序列的长度加1
b[i][j]=0; //制作辅助标识,表示x、y数组需要进一步“前进”才能达到当前长度
//即x[i-1],y[j-1]必须做出贡献
}
//当前字符不同,x序列下降一步(即c[i-1][j] )比y序列下降一步(即c[i][j-1] ) ) ) ) ) ) ) ) )。
//得到的公共子串的长度很长,隐含地意味着现在最长的公共子串可以不需要x[i-1]
ELSEif(c[I-1][j]=c[I][j-1] ) )
{
c[i][j]=c[i-1][j]; //当前最长的公共子序列可以不需要x[i-1]
b[i][j]=-1;
}
//与上面的分析相似
else
{
c[i][j]=c[i][j-1]; //当前最长的公共子序列可以不需要y[j-1]
b[i][j]=1;
}
}
}
for(intI=0; im 1; I )
{
delete c[i];
c[i]=NULL;
}
delete []c;
c=NULL;
}
//打印结果
voidprint_LCS(int**b,char *x,int i,int j ) ) ) ) ) ) ) ) ) ) ) ) ) )。
{
if(I==0||j==0)
返回;
if(b ) I ) j )==0) ) ) )。
{
print_LCS(b,x,i-1,j-1 );
coutx[i-1];
}
ELSEif(B ) I ) j )==-1 ) ) ) ) ) ) )。
print_LCS(b,x,i-1,j );
else
print_LCS(b,x,I,j-1 );
}
int_tmain(intargc,_TCHAR* argv[] () ) ) ) ) ) ) ) ) ) )。
{
char x[]='ADAB ';
char y[]='ADCA ';
intm=Strlen(x;
intn=Strlen(y;
int **b;
b=new int*[m 1];
for(intI=0; im 1; I )
b[i]=new int[n 1];
LCS_length(x,y,b,m,n );
print_LCS(b,x,m,n );
for(intI=0; im 1; I )
{
delete b[i];
b[i]=NULL;
}
删除[ ] b;
b=空;
返回0;
}