【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]
}
相关推荐
圣保罗的大教堂6 小时前
leetcode 3517. 最小回文排列 I 中等
leetcode
土豆.exe6 小时前
Fastjson2 2.0.53 哈希碰撞 RCE:从原理到三种打法
算法·哈希算法
黄河123长江6 小时前
有限Abel群的结构()
算法
Jerry7 小时前
LeetCode 92. 反转链表 II
算法
骊城英雄7 小时前
Rust从入门到精通-trait
人工智能·算法·rust
可编程芯片开发8 小时前
基于PI控制算法的pwm直流电机控制系统Simulink建模与仿真
算法
怕浪猫8 小时前
2840亿参数只卖白菜价:DeepSeek V4 Flash 正式版上线,Agent 能力暴涨6倍
人工智能·算法
让学习成为一种生活方式8 小时前
苄基异喹啉生物碱糖基转移酶UGT74AN1晶体--Journal of Agricultural and Food Chemistry
人工智能·算法
alphaTao8 小时前
LeetCode 每日一题 2026/7/27-2026/8/2
python·算法·leetcode
2501_926978339 小时前
提示工程的实战报告(二):模型的失败模式与边界行为
人工智能·深度学习·算法