最长重复子数组
给两个整数数组 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