心路历程:
这道题还是一个经典的DP问题,采用结尾包含答案的建模方式:
状态:分别以i, j为结尾的两个数组区间,两个末尾元素是否相同
动作:是否选择i-1 或者j-1的索引
返回值:最长子数组的长度
注意的点:
1、在包含答案的建模方式下,末尾元素不相同的话最长长度就是0
解法:动态规划
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
@cache
def dp(i, j): # 以nums1[i], nums2[j]结尾的最长子数组的长度
if i == 0 or j == 0: return int(nums1[i] == nums2[j])
if nums1[i] == nums2[j]:
return dp(i-1, j-1) + 1
else:
return 0
res = 0
for i1 in range(len(nums1)):
for j1 in range(len(nums2)):
res = max(res, dp(i1,j1))
return res