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];
    }
};
相关推荐
今天背单词了吗9806 小时前
算法学习笔记:19.牛顿迭代法——从原理到实战,涵盖 LeetCode 与考研 408 例题
笔记·学习·算法·牛顿迭代法
没书读了6 小时前
考研复习-数据结构-第六章-图
数据结构
jdlxx_dongfangxing7 小时前
进制转换算法详解及应用
算法
why技术8 小时前
也是出息了,业务代码里面也用上算法了。
java·后端·算法
future14128 小时前
C#进阶学习日记
数据结构·学习
2501_922895588 小时前
字符函数和字符串函数(下)- 暴力匹配算法
算法
IT信息技术学习圈9 小时前
算法核心知识复习:排序算法对比 + 递归与递推深度解析(根据GESP四级题目总结)
算法·排序算法
愚润求学9 小时前
【动态规划】01背包问题
c++·算法·leetcode·动态规划
会唱歌的小黄李10 小时前
【算法】贪心算法入门
算法·贪心算法
轻语呢喃11 小时前
每日LeetCode : 两数相加--链表操作与进位的经典处理
javascript·算法