https://leetcode.com/problems/maximum-length-of-repeated-subarray/description/
Given two integer arrays A and B, return the maximum length of an subarray that appears in both arrays.
Example 1:
Input:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
Output: 3
Explanation:
The repeated subarray with maximum length is [3, 2, 1].
Note:
1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100
我们使用一个二维的dp
数组,其中dp[i][j]
表示数组A的前i个数字和数组B的前j个数字的最长子数组的长度,如果dp[i][j]不为0,则A中第i个数组和B中第j个数字必须相等,比对于这两个数组[1,2,3,2,1]和[3,2,1,4,7],我们的dp数组为:
数组 | 1 | 2 | 3 | 2 | 1 |
---|---|---|---|---|---|
3 | 0 | 0 | 1 | 0 | 0 |
2 | 0 | 0 | 0 | 2 | 0 |
1 | 1 | 0 | 0 | 0 | 3 |
4 | 0 | 0 | 0 | 0 | 0 |
7 | 0 | 0 | 0 | 0 | 0 |
观察dp[i][j]不为0的点,其值都为其左上角的元素的值+1,所以可以得到dp公式: dp[i][j] = dp[i - 1][j - 1] + 1;
class Solution { public int findLength(int[] A, int[] B) { if(A == null || B == null || A.length == 0 || B.length == 0) return 0; int lengthA = A.length; int lengthB = B.length; int max = Integer.MIN_VALUE; int[][] dp = new int[lengthA + 1][lengthB + 1]; for(int i = 1; i <= lengthA; i++) { for(int j = 1; j <= lengthB; j++) { if(A[i - 1]== B[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; } if(max < dp[i][j]) max = dp[i][j]; } } return max; } }