LCS:给出两个字符串,求这两个字符串的最长公共部分(子序列可以不连续)
举个例子,比如organization和traditional两个字符串的中最长公共子序列就为“raition”,长度为7。
我们用动态规划来做的话,首先设dp[i][j]表示字符串A的第i号位和字符串B的第j号位之前的LCS长度。根据A[i]和B[j]相等或不相等可以分为两种情况:
1.A[i]==B[j],那么字符串A和字符串B的LCS长度就增加了一位,dp[i][j]=dp[i-1][j-1]+1;
2.A[i]!=B[j],那么字符串A和B的LCS长度就不会增加,就等于前面的LCS,前面的LCS有两种情况,一种是dp[i-1][j],一种是dp[i][j-1]。此时dp[i][j]会继承其中较大的LCS长度。
主要的代码:
for(int i=0;i<lenA;i++)
{
dp[i][0]=0;
}
for(int j=0;j<lenB;j++)
{
dp[0][j]=0;
}
for(int i=1;i<lenA;i++)
{
for(int j=1;j<lenB;j++)
{
if(A[i]==B[j])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}