题目原址
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;
AC代码
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;
}
}