最长重复子数组
链接: link.
给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。
示例 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.明确dp[i][j]的含义:长度为i的num1和长度为j的num2的公共最长子数组的长度。
2.dp初始化:数组之间的比较是从第一个元素就开始的,但是我们采用dp[i][j]又需要上一个状态dp[i-2][j-1],所以我们初始化时候最好在num1和num2前默认第一行第一列都是空数组,这样dp[i][0]和dp[0][j]都是0。
3.dp推导:因为重复子数组是连续的,所以dp[i][j]必须由dp[i-1][j-1]得来,dp[i][j-1]和dp[i-1][j]都不行,这个画一下dp列表会比较好理解。
python实现
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
#这里创建的dp中dp[i][0]和dp[0][j]都是0,不用单独初始化了
dp = [[0 for j in range(len(nums2)+1)]for i in range(len(nums1)+1)]
result = 0
#推导
for i in range(1,len(nums1)+1):
for j in range(1,len(nums2)+1):
#这里nums1[i-1] == nums2[j-1]采用[i-1]和[j-1]是因为前面创建dp时候多加了空行
if nums1[i-1] == nums2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
if dp[i][j] > result:
result = dp[i][j]
return result
仅记录刷题过程以及需要注意的知识点,方便自己复习。