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

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

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

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

题目:

思路:

我觉得这个总结挺好的:

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

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

另外,动态规划也是有套路的:单个数组或者字符串 要用动态规划时,可以把动态规划 dpi 定义为 nums0: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);
}
相关推荐
通信小呆呆5 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick5 天前
自动对焦学习-3
人工智能·学习·计算机视觉
Daisy Lee5 天前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
Alsn865 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
YM52e5 天前
买菜计算器小应用 - HarmonyOS ArkUI 开发实战-PC版本
学习·华为·harmonyos·鸿蒙·鸿蒙系统
小雨下雨的雨5 天前
HarmonyOS ArkUI训练营入门-组件掌握系列-Animation 动画效果实现-PC版本
学习·华为·harmonyos·鸿蒙
cqbzcsq5 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
YangYang9YangYan5 天前
2026初入职场学习数据分析的价值
学习·数据挖掘·数据分析
guslegend5 天前
理论学习:什么是 Coding Agent?
学习
自传.5 天前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding