LeetCode:718. Maximum Length of Repeated Subarray - Python

问题描述:

718. 最长重复子数组

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

示例 1:

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

说明:

  • 1 <= len(A), len(B) <= 1000
  • 0 <= A[i], B[i] < 100

问题分析:

是不是很像字符串匹配问题?,KMP算法应该就可以解决,现在介绍动态规划方法,设 dp[i][j] 表示子数组 A[:i] 和子数组 B[:j] 最长的子数组的长度,很显然得出状态方程

A[i - 1] == B[j - 1],  dp[i][j] = dp[i - 1][j - 1] + 1

Python3实现:

# @Time   :2018/09/08
# @Author :LiuYinxing
# 动态规划


class Solution:
    def findLength(self, A, B):
        n, m = len(A) + 1, len(B) + 1
        dp = [[0] * m for _ in range(n)]  # 初始化 dp
        ans = 0  # 保留最优解
        for i in range(1, n):
            for j in range(1, m):
                if A[i - 1] == B[j - 1]:
                    dp[i][j] = dp[i - 1][j - 1] + 1
                    ans = max(ans, dp[i][j])
        return ans


if __name__ == '__main__':
    solu = Solution()
    A, B = [1, 2, 3, 2, 1], [3, 2, 1, 4, 7]
    print(solu.findLength(A, B))

声明: 总结学习,有问题可以批评指正,大神可以略过哦。

猜你喜欢

转载自blog.csdn.net/XX_123_1_RJ/article/details/82529199