DP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public int findLength(int[] nums1, int[] nums2) { int m = nums1.length, n = nums2.length;
int maxLength = 0;
int[][] dp = new int[m + 1][n + 1]; for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { if (nums1[i - 1] == nums2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; maxLength = Math.max(maxLength, dp[i][j]); } else { dp[i][j] = 0; } } }
return maxLength; } }
|
因为 dp[i][j] 仅依赖 dp[i - 1][j - 1],所以可以降为一维数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public int findLength(int[] nums1, int[] nums2) { int[] dp = new int[nums2.length + 1]; int maxLength = 0; for (int i = 1; i <= nums1.length; i++) { for (int j = nums2.length; j >= 1; j--) { if (nums1[i - 1] == nums2[j - 1]) { dp[j] = dp[j - 1] + 1; }
maxLength = Math.max(maxLength, dp[j]); } }
return maxLength; } }
|
Sliding Window
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Solution { public int findLength(int[] nums1, int[] nums2) {
int maxLength = 0;
for (int j = nums2.length - 1; j >= 0; j--) { int length = findCommonLength(nums1, 0, nums2, j); maxLength = Math.max(maxLength, length); }
for (int i = 1; i < nums1.length; i++) { int length = findCommonLength(nums1, i, nums2, 0); maxLength = Math.max(maxLength, length); }
return maxLength; }
private int findCommonLength(int[] nums1, int i, int[] nums2, int j) { int maxLength = 0;
int length = 0; while (i < nums1.length && j < nums2.length) { if (nums1[i] == nums2[j]) { length++; maxLength = Math.max(maxLength, length); } else { length = 0; } i++; j++; }
return maxLength; } }
|
References
718. Maximum Length of Repeated Subarray