算法第三十二天-最长公共子序列

2024-03-27 1163阅读

温馨提示:这篇文章已超过368天没有更新,请注意相关的内容是否还可用!

最长公共子序列

题目要求

算法第三十二天-最长公共子序列

解题思路

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

  • 首先区分两个概念:子序列可以是不连续的;子数组(子字符串)是需要连续的;
  • 另外,动态规划也是需要套路的:单个数组或者字符串要用动态规划时,可以把动态规划dp[i]定义为num[0:i]中想要求的结果;当两个数组或者字符串要用动态规划时,可以把动态规划定义成二维的dp[i][j],其含义是在A[0:i]和B[0:j]之间匹配得到的想要的结果。

    1.状态定义

    比如对于本题而言,可以定义dp[i][j]表示text1[0:i-1]和text2[0:j-1]的最长公共子序列。

    之所以dp[i][j]的定义不是text1[0:i]和text2[0:j],是为了方便当i=0或者j=0的时候,dp[i][j]表示的为空字符串和另外一个字符串的匹配,这样子dp[i][j]可以初始化为0.

    2.状态转移方程

    知道状态定义之后,我们开始写状态转移方程。

    • 当text1[i-1]==text2[j-1]时,说明两个字符串的最后一位不相等,那么此时的状态dp[i][j]应该是dp[i-1][j]和dp[i][j-1]的最大值。举个例子,比如对于ace和bc而言,它们的最长公共子序列的长度等于①ace和b的最长公共子序列长度0与②ac和bc的最长公共子序列长度1的最大值,即1.

      综上,状态转移方程为:

    • dp[i][j]=dp[i-1][j-1]+1,当text1[i-1]==text[j-1];
    • dp[i][j]=max(dp[i-1][j],dp[i][j-1]),当text1[i-1]!=text2[j-1]

      3.状态的初始化

      初始化就是要看当i=0与j=0时,dp[i][j]应该取值为多少;

      • 当i=0时,dp[0][j]表示的时text1中取空字符串跟text2的最长公共子序列,结果肯定为0;
      • 当j=0时,dp[i][0]表示的是text2中取空字符串跟text1的最长公共子序列,结果肯定为0

        综上,当i=0或者j=0时,dp[i][j]初始化为0

        4.遍历方向与范围

        由于dp[i][j]依赖于dp[i-1][j-1],dp[i-1][j],dp[i][j-1],所以i和j的遍历顺序肯定是从小到大的。

        另外,由于当i和j取值为0的时候,dp[i][j]=0,而dp数组本身初始化就是为0,所以,直接让i和j从1开始遍历。遍历的结束应该是字符串的长度为len(text1)和len(text2)

        5.最终返回结果

        由于dp[i][j]的含义是text1[0:i-1]和text2[0:j-1]的最长公共子序列。所以需要返回的结果是i=len(text1)并且j=len(text2)时的dp[len(text1)][len(text2)]

        代码

        class Solution:
            def longestCommonSubsequence(self, text1: str, text2: str) -> int:
                M=len(text1)
                N=len(text2)
                dp=[[0]*(N+1)  for _ in range(M+1)]
                for i in range(1,M+1):
                    for j in range(1,N+1):
                        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])
                return dp[M][N]
        

        复杂度分析

        时间复杂度: O ( M N ) O(MN) O(MN)

        空间复杂度: O ( M N ) O(MN) O(MN)

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]