- 最长重复子数组难度中等
给两个整数数组 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
- 解题思路
- 注意: 因为是最长公共所以当前位置只和 i -1 和 j - 1有关,这样才是连续的
剩下的元素 f(i, j) = A[i] == B[j] ? (1 + res[i-1][j-1]) : 0;
class Solution {
public int findLength(int[] A, int[] B) {
int resNum = 0;
int al = A.length;
int bl = B.length;
//res[i][j] 代表数组A的前i个元素和数组B的前j个元素的最长子数组长度
int res[][] = new int[al][bl];
//初始化res[0][j]
//初始化res[i][0]
for(int k = 0; k < bl; k++) {
res[0][k] = A[0] == B[k] ? 1 : 0;
res[k][0] = B[0] == A[k] ? 1 : 0;
}
//剩下的元素 f(i, j) = A[i] == B[j] ? (1 + res[i-1][j-1]) : 0;
for(int i = 1; i < al; i++) {
for (int j = 1; j < bl ; j++) {
res[i][j] = A[i] == B[j] ? (1 + res[i-1][j-1]) : 0;
if (res[i][j] > resNum)
resNum = res[i][j];
}
}
return resNum;
}
}