1、公共子序列定义:
非连续序列,如Z=<B,C,D,B>是X=<A,B,C,B,D,A,B>的子序列,也是Y的子序列。
方程式:
dp[i][j]来表示第一个串的前i位和第二个串的前j位中的最长公共子序列
for (int i = 0; i <= strlen(a); i++)
{
dp[i][0] = 0;
}
for (int j = 0; j <= strlen(b); j++)
{
dp[0][j] = 0;
}
for (int i = 1; i <= strlen(a); i++)
{
for (int j = 1; j <= strlen(b); j++)
{
if (a[i - 1] == b[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
2、最长公共子串(连续序列)
dp[i][j]来表示第一个string第i项结尾和第二个string的第j项结尾的最长连续子序列。
IF a[i]==b[j] => dp[i][j]=dp[i-1][j-1]+1
IF a[i]≠b[j] => dp[i][j]=0
for(int i=0;i<=strlen(a);i++)
{
dp[i][0]=0;
}
for(int j=0;j<=strlen(b);j++)
{
dp[0][j]=0;
}
for(int i=1;i<=strlen(a);i++)
{
for(int j=1;j<=strlen(b);j++)
{
if(a[i-1]==b[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
dp[i][j]=0;
}
}
}
int maxn=-1;
for(int i=1;i<=strlen(a);i++)
{
for(int j=1;j<=strlen(b);j++)
{
maxn=max(maxn,dp[i][j]);
}
}