最长公共子序列
1143. 最长公共子序列 - 力扣(LeetCode)
我又悟了!本题和之前刷的那些子序列区别之处在于,可以是不连续的。下面小小总结一波:
- 初始序列有俩——创建二维
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;}