最长重复子数组

LeetCode每日一题,718.Maximum Length of Repeated Subarray

先看题目描述

大意就是给定两个数组,返回最长重复子数组的长度

算法和思路

动态规划

  • dp[m][n] 表示分别以 A[m - 1],B[n - 1] 为结尾的最长重复子数组长度
  • 状态转移方程:若A[m - 1] = B[n - 1],dp[m][n] = dp[m - 1][n - 1] + 1,否则 dp[m][n] = 0
  • 在动态规划过程用一个变量 res 来维护最长重复子数组长度

算法源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int findLength(int[] A, int[] B) {
int len1 = A.length;
int len2 = B.length;
int res = 0;
int[][] dp = new int[len1 + 1][len2 + 1];
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (A[i - 1] == B[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
res = Math.max(res, dp[i][j]);
}
}
}
return res;
}
}