给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例 1:
输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度最长的公共子数组是 [3, 2, 1]。说明:
1 <= len(A), len(B) <= 10000 <= A[i], B[i] < 100注意: 子数组是连续的,子序列可以不连续。
对于a中的每个数字,在b中依次比较,如果相同,同步向后,不同就记录最大值。
时间复杂度O(N²)。 这个方法会超时。
很容易发现,如果两个数字相同,并且他们俩前面的数字也相同,那么这个子数组的长度就可以加1。
我们用一个二维数组dp[i][j]来记录每一对ij对应的子数组的长度。
如果A[i]和B[j]不相等,那么这一对数据不构成公共子数组,所以赋值为0。
如果A[i]和B[j]相等,那么这一堆数据上面的公共子数组的长度就等于他们前面那一对数据的长度加1。所以得到了如下递推方程:
i>=1 && j>=1 时: dp[i][j] = A[i] == B[j]?dp[i-1][j-1]+1:0
i<1 || j<1 时: dp[i][j] = A[i] == B[j]?1:0