求最长最长公共子序列的长度的时间复杂度为O(m*n),空间复杂度同样为O(m*n)
算法简介:
首先初始化一个n*n的二维数组m[a.size()][b.size()]全为0
然后写一个二重循环逐个计算二维数组中的值。
主要利用一下递推关系:
if(a[i] == b[i])
m[i + 1][j + 1] = m[i][j] + 1
else
m[i + 1][j + 1] = MAX(m[i + 1][j], m[i][j + 1]
模块化实现函数源代码如下:
int lcsLength(string a,string b)
{
int **m;
int i,j;
m=new int*[a.size()+1];
for(i=0;i<a.size()+1;i++)
m[i]=new int[b.size()+1];
for(i=0;i<=a.size();i++)
for(j=0;j<=b.size();j++)
m[i][j]=0;
for(i=0;i<a.size();i++)
{
for(j=0;j<b.size();j++)
{
if(a[i]==b[j])
m[i+1][j+1]=m[i][j]+1;
else if(m[i+1][j]>m[i][j+1])
m[i+1][j+1]=m[i+1][j];
else
m[i+1][j+1]=m[i][j+1];
}
}
return m[a.size()][b.size()];
}