class Solution:
def findLength(self, A: List[int], B: List[int]) -> int:
n, m = len(A), len(B)
cache = [[0] * (m + 1) for _ in range((n + 1))]
max_len = 0
for i in range(n):
for j in range(m):
if A[i] == B[j]:
cache[i + 1][j + 1] = cache[i][j] + 1
max_len = max(max_len, cache[i + 1][j + 1])
else:
cache[i + 1][j + 1] = 0
return max_len
滚动数组
为了节省动态规划中使用的二维状态矩阵的空间, 使用滚动数组的思路进行优化.
class Solution:
def findLength(self, A: List[int], B: List[int]) -> int:
n, m = len(A), len(B)
if n > m:
A, B = B, A
n, m = m, n
cache = 0
max_len = 0
for i in range(-(n - 1), m):
for j in range(n):
if i < 0 or i >= m:
i += 1
continue
if A[j] == B[i]:
if i == 0 or j == 0:
cache = 1
else:
cache += 1
max_len = max(max_len, cache)
else:
cache = 0
i += 1
return max_len
class Solution:
def findLength(self, A: List[int], B: List[int]) -> int:
n, m = len(A), len(B)
res = 0
def count_length(length, a_start, b_start):
r, k = 0, 0
ta, tb = A[a_start:], B[b_start:]
for i in range(length):
if ta[i] == tb[i]:
k += 1
r = max(r, k)
else:
k = 0
return r
for i in range(n):
res = max(res, count_length(min(m, n - i), i, 0))
for i in range(m):
res = max(res, count_length(min(n, m - i), 0, i))
return res