状态定义: dp[i][j]:数组A的前i个字符和数组B的前j个字符公共子数组的的个数 状态转移方程: 如果A[i] == B[j],那么: dp[i][j] = dp[i-1][j-1]+1 初始化: 所有dp为0,dp[0][0]为0,解释:A的前0个字符和B的前0个字符的公共子数组的个数为0 比如: 对于示例:
[1,2,3,2,1] [3,2,1,4,7]dp数组为:
3 2 1 4 7 [ [0, 0, 0, 0, 0, 0], 1 [0, 0, 0, 1, 0, 0], 2 [0, 0, 1, 0, 0, 0], 3 [0, 1, 0, 0, 0, 0], 2 [0, 0, 2, 0, 0, 0], 1 [0, 0, 0, 3, 0, 0]]代码如下:
class Solution: def findLength(self, A: List[int], B: List[int]) -> int: #动态规划 res = 0 m,n = len(A),len(B) dp = [[0]*(n+1) for _ in range(m+1)] for i in range(1,m+1): for j in range(1,n+1): if A[i-1] == B[j-1]: dp[i][j] = dp[i-1][j-1] + 1 res = max(res,dp[i][j]) return res时间复杂度:O(NM),N、M分别是两个数组的长度 空间复杂度:O(NM)