【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]
}
相关推荐
dazzle34 分钟前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵35 分钟前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强1 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发1 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
张登杰踩1 小时前
MCR ALS 多元曲线分辨算法详解
算法
YuTaoShao1 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波0071 小时前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
风暴之零1 小时前
变点检测算法PELT
算法
深鱼~1 小时前
视觉算法性能翻倍:ops-cv经典算子的昇腾适配指南
算法·cann
李斯啦果1 小时前
【PTA】L1-019 谁先倒
数据结构·算法