【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]
}
相关推荐
hhlongg1 分钟前
FFT分析
算法
水龙吟啸24 分钟前
华为2026.6.17机考选择题+编程题【速刷敲黑板】
人工智能·深度学习·算法·华为
凌波粒35 分钟前
LeetCode--53. 最大子序和(贪心算法)
算法·leetcode·贪心算法
Hesionberger44 分钟前
快速求解完全平方数的最少数量
开发语言·数据结构·python·算法·leetcode·c#
c2385644 分钟前
《序列 DP:C++ 中的“最长”套路与编辑距离》
c++·算法·动态规划
aqiu1111111 小时前
【算法日记 19】LeetCode 1. 两数之和:梦开始的地方,哈希表的降维打击
算法·leetcode·职场和发展
CS创新实验室10 小时前
算法、齿轮与硅基大脑:数值计算发展简史
人工智能·算法·数值计算
海石12 小时前
1563分的简单题,可能就简单在能被暴力AC
算法·leetcode
海石12 小时前
1400分的dp汗流浃背之【交替子数组计数】
算法·leetcode
奋发向前wcx12 小时前
P2590 树的统计 题目解析
数据结构·算法·深度优先