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]);
}
}
本文详细解析了最长公共子序列(LCS)算法,通过动态规划方法解决两个字符串的LCS问题,提供了清晰的实现思路和代码示例。理解LCS有助于提升算法设计能力。
2005

被折叠的 条评论
为什么被折叠?



