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];
    }
};
相关推荐
刃神太酷啦6 分钟前
堆和priority_queue
数据结构·c++·蓝桥杯c++组
Orange--Lin13 分钟前
【用deepseek和chatgpt做算法竞赛】——还得DeepSeek来 -Minimum Cost Trees_5
人工智能·算法·chatgpt
01_21 分钟前
力扣hot100 ——搜索二维矩阵 || m+n复杂度优化解法
算法·leetcode·矩阵
SylviaW0823 分钟前
python-leetcode 35.二叉树的中序遍历
算法·leetcode·职场和发展
篮l球场24 分钟前
LeetCodehot 力扣热题100
算法·leetcode·职场和发展
pzx_00136 分钟前
【机器学习】K折交叉验证(K-Fold Cross-Validation)
人工智能·深度学习·算法·机器学习
BanLul37 分钟前
进程与线程 (三)——线程间通信
c语言·开发语言·算法
落羽的落羽43 分钟前
【落羽的落羽 数据结构篇】栈和队列
c语言·数据结构
qy发大财1 小时前
分发糖果(力扣135)
数据结构·算法·leetcode
滴_咕噜咕噜1 小时前
C#基础总结:常用的数据结构
开发语言·数据结构·c#