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];
    }
};
相关推荐
水蓝烟雨1 小时前
1128. 等价多米诺骨牌对的数量
算法·hot 100
codists1 小时前
《算法导论(第4版)》阅读笔记:p11-p13
算法
Kidddddult3 小时前
力扣刷题Day 43:矩阵置零(73)
算法·leetcode·力扣
大龄Python青年5 小时前
C语言 交换算法之加减法,及溢出防范
c语言·开发语言·算法
啊我不会诶5 小时前
CF每日5题
算法
朱剑君6 小时前
排序算法——基数排序
算法·排序算法
COOCC16 小时前
PyTorch 实战:从 0 开始搭建 Transformer
人工智能·pytorch·python·深度学习·算法·机器学习·transformer
yzlAurora6 小时前
删除链表倒数第N个节点
数据结构·链表
进击的小白菜7 小时前
如何高效实现「LeetCode25. K 个一组翻转链表」?Java 详细解决方案
java·数据结构·leetcode·链表
拾忆-eleven7 小时前
C++算法(19):整数类型极值,从INT_MIN原理到跨平台开发实战
数据结构·c++·算法