【Golang】LeetCode 1143. 最长公共子序列

1143. 最长公共子序列

题目描述

思路

这是一道非常经典的二维动态规划应用问题。我们都知道应该使用二维动态规划来解决这个问题,但是好像我没有仔细思考过为什么应该使用二维动态规划来解决这个问题,因此在此分析一下。

如果不使用动态规划,我们自然想到最坏的情况就是使用暴力枚举来解决这个问题,问题仍然在于不能够复用之前已经求过的公共子序列。因此我们定义一个二维数组dpdp[i][j]的含义就是text0...i的子串和text20...j的子串的最长公共子序列的长度。

显然,如果存在text1[i] == text2[j]的情况,则dp[i][j] = dp[i - 1][j -1] + 1,即如果当前两个串当中遍历到的字符是相等的,则0...i0...j子串的最长公共子序列的长度是0...i - 10...j - 1串的结果加上1;而如果text[1] != text2[j],则dp[i][j] = max(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]),意味着如果当前text1[1] != text[2],则不能增加0...i0...j子串的最长公共子序列的长度,该位置的最长公共子序列长度应该取可能的最大值。

基于以上思路,我们便可以写代码解决问题了。

Golang 代码

go 复制代码
func longestCommonSubsequence(text1 string, text2 string) int {
    m, n := len(text1), len(text2)
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i ++ {
        dp[i] = make([]int, n + 1)
    }

    for i := 1; i <= m; i ++ {
        for j := 1; j <= n; j ++ {
            if text1[i - 1] == text2[j - 1] {
                dp[i][j] = dp[i - 1][j - 1] + 1
            } else {
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1])
            }
        }
    }
    
    return dp[m][n]
}
相关推荐
暮冬-  Gentle°8 小时前
C++中的工厂方法模式
开发语言·c++·算法
沐硕8 小时前
《基于改进协同过滤与多目标优化的健康饮食推荐系统设计与实现》
java·python·算法·fastapi·多目标优化·饮食推荐·改进协同过滤
Z9fish8 小时前
sse哈工大C语言编程练习47
c语言·数据结构·算法
nglff8 小时前
蓝桥杯抱佛脚第一天|简单模拟,set,map的使用
算法·职场和发展·蓝桥杯
仟濹9 小时前
【算法打卡day27(2026-03-19 周四)】蓝桥云课中Lv.1难度中的绝大部分题
算法·蓝桥杯
罗湖老棍子9 小时前
滑动窗口与双调队列:幕布覆盖问题(定右缩左满分板子)改编自LeetCode 1438
算法·滑动窗口·单调队列
CoovallyAIHub9 小时前
ICLR 2026 | MedAgent-Pro:用 Agent 工作流模拟临床医生的循证诊断过程
深度学习·算法·计算机视觉
实心儿儿9 小时前
算法7:两个数组的交集
算法·leetcode·职场和发展
我可能是个假开发9 小时前
算法-回溯
算法
WolfGang0073219 小时前
代码随想录算法训练营 Day14 | 二叉树 part04
数据结构·算法