最长公共子序列
我又悟了!本题和之前刷的那些子序列区别之处在于,可以是不连续的。下面小小总结一波:
- 初始序列有俩——创建二维
dp[i][j]
表示当text1取i个,text2取j个的时候,其最长公共子序列的长度 - 可以不连续——除了相同时的情况,直接
dp[i][j]=dp[i-1][j-1]+1;
,还需要额外判断不相同的时候,else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
,作用是来维护当前二维数组值的有效性。大家可以试试不加else这条,然后打印dp,会发现刚刚记录的有效值会因为不连续在下一次而无法使用 - 初始化——长度为0的时候,不存在公共子序列,为0
AC :
int longestCommonSubsequence(string text1, string text2) {
int n1=text1.size(),n2=text2.size();
vector<vector<int>>dp(n1+1,vector<int>(n2+1,0));
int ans=0;
for(int i=1;i<=n1;i++)
{
for(int j=1;j<=n2;j++)
{
if(text1[i-1]==text2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
ans=max(ans,dp[i][j]);
}
}
return ans;
}