数据结构学习 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);
}
相关推荐
努力毕业的小土博^_^23 分钟前
【深度学习|学习笔记】 Generalized additive model广义可加模型(GAM)详解,附代码
人工智能·笔记·深度学习·神经网络·学习
虾球xz36 分钟前
游戏引擎学习第277天:稀疏实体系统
c++·学习·游戏引擎
小堃学编程39 分钟前
前端学习(2)—— CSS详解与使用
前端·css·学习
虾球xz3 小时前
游戏引擎学习第276天:调整身体动画
c++·学习·游戏引擎
虾球xz3 小时前
游戏引擎学习第275天:将旋转和剪切传递给渲染器
c++·学习·游戏引擎
qq_386322694 小时前
华为网路设备学习-21 IGP路由专题-路由过滤(filter-policy)
前端·网络·学习
J先生x4 小时前
【IP101】图像处理进阶:从直方图均衡化到伽马变换,全面掌握图像增强技术
图像处理·人工智能·学习·算法·计算机视觉
虾球xz8 小时前
游戏引擎学习第268天:合并调试链表与分组
c++·学习·链表·游戏引擎
Y3174299 小时前
Python Day23 学习
python·学习
song_ly0019 小时前
深入理解软件测试覆盖率:从概念到实践
笔记·学习·测试