数据结构学习 Leetcode1143最长公共子序列

动态规划 最长公共子序列LCS

这是我在看动态规划学习的时候做的。

这是一篇LCS。LCS是两个数组进行比较。

题目:

思路:

我觉得这个总结挺好的:

求两个数组或者字符串的最长公共子序列问题,肯定是要用动态规划的。

首先,区分两个概念:子序列可以是不连续的;子数组(子字符串)需要是连续的;

另外,动态规划也是有套路的:单个数组或者字符串 要用动态规划时,可以把动态规划 dp[i] 定义为 nums[0:i] 中想要求的结果;当两个数组或者字符串 要用动态规划时,可以把动态规划定义成两维的 dp[i][j] ,其含义是在 A[0:i]B[0:j] 之间匹配得到的想要的结果。

状态: dp[i][j]:第一个串的前i位和第二个串的前j位中的最长公共子序列

转移方程:

复杂度计算:

时间复杂度:O(nm)

空间复杂度:O(nm)

代码:

cpp 复制代码
#include <string>
#include <vector>
#include <iostream>
//动态规划
// 最长公共子序列
//时间复杂度:O(n×m)
//空间复杂度:O(n×m)
class Solution {
public:
    int longestCommonSubsequence(std::string text1, std::string text2) {
        std::vector<std::vector<int>> dp(text1.size(), std::vector<int>(text2.size(), 0));
        for (int i = 0; i < text1.size(); ++i)
        {
            for (int j = 0; j < text2.size(); ++j)
            {
                if (text1[i] == text2[j])
                    dp[i][j] = (i > 0 && j > 0) ? dp[i - 1][j - 1] + 1 : 1;
                else
                {
                    int a_tmp = i > 0 ? dp[i - 1][j] : 0;
                    int b_tmp = j > 0 ? dp[i][j - 1] : 0;
                    dp[i][j] = std::max(a_tmp, b_tmp);
                }
                    
            }
        }
        return dp[text1.size() - 1][text2.size() - 1];
    }
};

void Test_solution1()
{
    std::string text1{ "abceda" };
    std::string text2{ "acea" };
    Solution solution;
    std::cout<<solution.longestCommonSubsequence(text1, text2);
}
相关推荐
_李小白4 分钟前
【OSG学习笔记】Day 2: Hello Cow
笔记·学习
ic爱吃蓝莓11 分钟前
数据结构 | HashMap原理
数据结构·学习·算法·链表·哈希算法
鹭天21 分钟前
Langchain学习笔记
笔记·学习·langchain
星幻元宇VR2 小时前
VR环保学习机|科技助力绿色教育新模式
大数据·科技·学习·安全·vr·虚拟现实
_一只小QQ3 小时前
软考中级第二节
学习
小飞菜涅4 小时前
fast-lio2复现
嵌入式硬件·学习·ubuntu
Century_Dragon4 小时前
哈弗M6汽车故障诊断与排除仿真教学软件:让课堂与实训无缝对接
学习
for_ever_love__4 小时前
Objective- C学习: 手动内存管理
c语言·学习·ios·objective-c
gechunlian884 小时前
Spring Security 官网文档学习
java·学习·spring
2401_853448235 小时前
Maix例程代码学习
学习