【题目】
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
【示例】
输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出:3
解释:
长度最长的公共子数组是 [3, 2, 1] 。
【提示】
1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100
【黄金法则】
- 子序列默认不连续,子数组默认连续
- 子序列用有限状态自动机,子数组用动态规划
【代码】
【Python】
【Method1:暴力法】超时!!!
class Solution:
def findLength(self, A: List[int], B: List[int]) -> int:
ans = 0
for i in range(len(A)):
for j in range(len(B)):
k=0
while i+k<len(A) and j+k<len(B) and A[i+k]==B[j+k]:
k+=1
ans=max(ans,k)
return ans
【Method2:动态规划】
class Solution:
def findLength(self, A: List[int], B: List[int]) -> int:
n, m = len(A), len(B)
dp = [[0] * (m + 1) for _ in range(n + 1)]
#dp: n+1行 m+1列
ans = 0
for i in range(n - 1, -1, -1):
for j in range(m - 1, -1, -1):
dp[i][j] = dp[i + 1][j + 1] + 1 if A[i] == B[j] else 0
ans = max(ans, dp[i][j])
return ans