leecode1143.最长公共子序列
这道题目和最长重复子数组是一个类型的不同之处在于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));//默认全0
dp[0][0]=text1[0]==text2[0]?1:0;
for(int j=1;j<n;j++){
if(text1[0]==text2[j])
dp[0][j]=1;
else
dp[0][j]=dp[0][j-1];
}
for(int i=1;i<m;i++){
// j为0的情况单独判断
if(text1[i]==text2[0])
dp[i][0]=1;
else
dp[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;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[m-1][n-1];
}
};