给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。 说明: 1 <= len(A), len(B) <= 1000 0 <= A[i], B[i] < 100 解题思路 1、利用滑动窗口将两个数值进行对齐,最长重复子数组在 A 和 B 中的开始位置相同,我们就可以对这两个数组进行一次遍历,得到子数组的长度。 2、对齐的方式有两类:第一类为 A 不变,B 的首元素与 A 中的某个元素对齐;第二类为 B 不变,A 的首元素与 B 中的某个元素对齐。
class Solution: def findLength(self, A: List[int], B: List[int]) -> int: #定义maxLength函数 def maxLength(addA: int, addB: int, length: int) -> int: ret = k = 0 #比较对齐的数的元素是否一致 for i in range(length): if A[addA + i] == B[addB + i]: k += 1 ret = max(ret, k) else: k = 0 return ret #n,m为A,B数组的长度 n, m = len(A), len(B) ret = 0 #A不变B滑动(B的首元素与A中某个元素对齐)length为A中未对齐的元素 for i in range(n): length = min(m, n - i) ret = max(ret, maxLength(i, 0, length)) #B不变A滑动(A的首元素与B中某个元素对齐)length为B中未对齐的元素 for i in range(m): length = min(n, m - i) ret = max(ret, maxLength(0, i, length)) return ret