• LeetCode:718. 最长重复子数组 - Python


    718. 最长重复子数组

    问题描述:

    给两个整数数组 nums1nums2 ,返回 两个数组中 公共的长度最长子数组长度

    示例 1:

    输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
    输出:3
    解释:长度最长的公共子数组是 [3,2,1] 。

    示例 2:

    输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
    输出:5

    提示:

    • 1 <= nums1.length, nums2.length <= 1000
    • 0 <= nums1[i], nums2[i] <= 100

    问题分析:

    • 动态规划老题目了,前面有 LeetCode:1143. 最长公共子序列 - Python , 求子序列的题目,这个是子数组,如果是字符串的话就求子串,大家注意子串子序列是有区别的哦。子序列 一般是指的是相对位置不变就是子序列子串严格连续的。
    • 这个时候其实可以转换成公共前缀或者公共后缀(以什么结尾)的问题,设假设dp[i][j] 表示字符串text1[0:i]和字符串text2[0:j]最长公共后缀串的长度,现在讨论细节:
      (1) 很显然当i=0 or j=0时,dp0
      (2) text1[0:i] == text2[0:j] 时,很显然就上一个状态加上1,即:dp[i][j]=dp[i-1][j-1]+1
      (3) text1[0:i] != text2[0:j] 时,不相等,那就当前字符串text1[0:i]text2[0:j] 没有公共后缀串,所以就是0了,即:dp[i][j]=0,所以整体状态转移方差为:
    i=0 or j=0 : dp[i][j] = 0
    nums1[i-1] == nums2[j-1]: dp[i][j] = dp[i-1][j-1] + 1
    nums1[i-1] != nums2[j-1]: dp[i][j] = 0
    
    • 1
    • 2
    • 3

    Python3实现:

    # @Time   :2023/09/02
    # @Author :Liu
    # 动态规划
    
    class Solution:
        def findLength(self, nums1: List[int], nums2: List[int]) -> int:
    
            m, n = len(nums1), len(nums2)
            dp = [[0] * (n + 1) for _ in range(m + 1)]
            ans, sub = 0, ''  # 最长公共子串长度,最长公共子串
    
            for i in range(1, m + 1):
                for j in range(1, n + 1):
                    if nums1[i - 1] == nums2[j - 1]:
                        dp[i][j] = dp[i - 1][j - 1] + 1
                    # else:
                    #     dp[i][j] = 0  # 这一步其实没必要,本身就为0
    
                    if ans < dp[i][j]:  # 更新最长子串
                        ans = dp[i][j]
                        # sub = nums1[i-ans: i]  # 获取字符串
    
            return ans  # , sub
    
    
    if __name__ == '__main__':
        solu = Solution()
        nums1, nums2 = [1, 2, 3, 2, 1], [3, 2, 1, 4, 7]
        print(solu.findLength(nums1, nums2))  # 3 [3, 2, 1]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    相关参考:题目链接
    声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。

  • 相关阅读:
    idea 引用本地jar包
    腾讯云服务器安装宝塔面板并快速搭建WordPress个人站点
    MongoDB 副本集创建索引无响应
    「零基础从零开始写VO视觉里程计」概率论、最小二乘、图优化(7-4)
    AI工人操作行为流程规范识别算法
    微服务(Microservice)那点事儿
    [模型]拉格朗日插值法
    Logic Pro X10.7.9(mac乐曲制作软件)
    Android ContentProvider
    许啸宇:从内部研发到开源开发之路|OneFlow U
  • 原文地址:https://blog.csdn.net/XX_123_1_RJ/article/details/132644955