这道题目和最长重复子数组是一个类型的不同之处在于text1[i]!=text2[j]时dp[i][j]时他的值是继承上一行或上一列的最大值,二者dp数组的含义也不一样,这里的dp[i][j]表示的是以text[i]和text2[j]为结尾的子序列最大长度,这也是导致两种问题当判断不等的时候处理逻辑不同,对于子数组由于不能跨元素作为子数组所以不等的时候只能赋值为0,而子序列是可以跨元素的所以不等时是可以继承自上一行和上一列
我这里代码写的臃肿,原因是对于0行索引和0列索引都要单独进行判断,其实还有更好的写法,可以自行去查阅
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int m=text1.size(),n=text2.size();vector<vector<int>> dp(m,vector<int>(n));//默认全0dp[0][0]=text1[0]==text2[0]?1:0;for(int j=1;j<n;j++){if(text1[0]==text2[j])dp[0][j]=1;elsedp[0][j]=dp[0][j-1];}for(int i=1;i<m;i++){// j为0的情况单独判断if(text1[i]==text2[0])dp[i][0]=1;elsedp[i][0]=dp[i-1][0];for(int j=1;j<n;j++){if(text1[i]==text2[j])dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}return dp[m-1][n-1];}
};