# 给两个整数数组 A 和 B ，返回两个数组中公共的、长度最长的子数组的长度。
#
# 示例 1:
#
# 输入:
# 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
#
# 来源：力扣（LeetCode）
# 链接：https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray
# 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
from typing import List

class Solution:
    def findLength(self, A: List[int], B: List[int]) -> int:
        m = len(A)
        n = len(B)
        dp = [[0] * m for _ in range(n)]
        ans = 0
        for i in range(m):
            for j in range(n):
                if A[i] == B[j]:
                    dp[i][j] = (dp[i - 1][j - 1] if i > 0 and j > 0 else 0) + 1
                    ans = max(ans, dp[i][j])
        return ans


if __name__ == '__main__':
    s = Solution()
    assert s.findLength([1, 2, 3, 2, 1], [3, 2, 1, 4, 7]) == 3