leecode1143.最长公共子序列

这道题目和最长重复子数组是一个类型的不同之处在于text1[i]!=text2[j]时dp[i][j]时他的值是继承上一行或上一列的最大值,二者dp数组的含义也不一样,这里的dp[i][j]表示的是以text[i]和text2[j]为结尾的子序列最大长度,这也是导致两种问题当判断不等的时候处理逻辑不同,对于子数组由于不能跨元素作为子数组所以不等的时候只能赋值为0,而子序列是可以跨元素的所以不等时是可以继承自上一行和上一列

我这里代码写的臃肿,原因是对于0行索引和0列索引都要单独进行判断,其实还有更好的写法,可以自行去查阅

cpp 复制代码
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];
    }
};
相关推荐
_殊途几秒前
算法--滑动窗口
算法
kkk1622245几秒前
matlab有限元求转子临界转速
算法
Non importa5 分钟前
【初阶数据结构】线性表之双链表
c语言·开发语言·数据结构·c++·考研·链表·学习方法
啥都鼓捣的小yao25 分钟前
Python使用SVC算法解决乳腺癌数据集分类问题——寻找最佳核函数
python·算法·分类
ydm_ymz2 小时前
初阶8 list
c语言·开发语言·数据结构·c++·list
Java版蜡笔小新2 小时前
算法-贪心算法
算法·贪心算法
LuckyAnJo2 小时前
Leetcode-100 回溯法-电话号码的字母组合
python·算法·leetcode
HR Zhou2 小时前
群体智能优化算法-鹈鹕优化算法(Pelican Optimization Algorithm, POA,含Matlab源代码)
算法·机器学习·matlab·优化·群体智能优化
LuckyLay2 小时前
LeetCode算法题(Go语言实现)_20
算法·leetcode·职场和发展·golang
意疏3 小时前
【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林
数据结构