class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
}
};
718. 最长重复子数组
给两个整数数组 nums1
和 nums2
,返回 两个数组中 公共的 、长度最长的子数组的长度 。
示例 1:
输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7] 输出:3 解释:长度最长的公共子数组是 [3,2,1] 。
示例 2:
输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0] 输出:5
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 100
相似题目
原站题解
python3 解法, 执行用时: 1940 ms, 内存消耗: 14.9 MB, 提交时间: 2022-12-06 13:35:57
class Solution: def findLength(self, A: List[int], B: List[int]) -> int: def maxLength(addA: int, addB: int, length: int) -> int: ret = k = 0 for i in range(length): if A[addA + i] == B[addB + i]: k += 1 ret = max(ret, k) else: k = 0 return ret n, m = len(A), len(B) ret = 0 for i in range(n): length = min(m, n - i) ret = max(ret, maxLength(i, 0, length)) for i in range(m): length = min(n, m - i) ret = max(ret, maxLength(0, i, length)) return ret
golang 解法, 执行用时: 20 ms, 内存消耗: 2.9 MB, 提交时间: 2022-12-06 13:35:44
func findLength(A []int, B []int) int { n, m := len(A), len(B) ret := 0 for i := 0; i < n; i++ { len := min(m, n - i) maxLen := maxLength(A, B, i, 0, len) ret = max(ret, maxLen) } for i := 0; i < m; i++ { len := min(n, m - i) maxLen := maxLength(A, B, 0, i, len) ret = max(ret, maxLen) } return ret } func maxLength(A, B []int, addA, addB, len int) int { ret, k := 0, 0 for i := 0; i < len; i++ { if A[addA + i] == B[addB + i] { k++ } else { k = 0 } ret = max(ret, k) } return ret } func max(x, y int) int { if x > y { return x } return y } func min(x, y int) int { if x < y { return x } return y }
java 解法, 执行用时: 28 ms, 内存消耗: 41.3 MB, 提交时间: 2022-12-06 13:35:31
class Solution { public int findLength(int[] A, int[] B) { int n = A.length, m = B.length; int ret = 0; for (int i = 0; i < n; i++) { int len = Math.min(m, n - i); int maxlen = maxLength(A, B, i, 0, len); ret = Math.max(ret, maxlen); } for (int i = 0; i < m; i++) { int len = Math.min(n, m - i); int maxlen = maxLength(A, B, 0, i, len); ret = Math.max(ret, maxlen); } return ret; } public int maxLength(int[] A, int[] B, int addA, int addB, int len) { int ret = 0, k = 0; for (int i = 0; i < len; i++) { if (A[addA + i] == B[addB + i]) { k++; } else { k = 0; } ret = Math.max(ret, k); } return ret; } }
java 解法, 执行用时: 24 ms, 内存消耗: 49.9 MB, 提交时间: 2022-12-06 13:35:13
class Solution { public int findLength(int[] A, int[] B) { int n = A.length, m = B.length; int[][] dp = new int[n + 1][m + 1]; int ans = 0; for (int i = n - 1; i >= 0; i--) { for (int j = m - 1; j >= 0; j--) { dp[i][j] = A[i] == B[j] ? dp[i + 1][j + 1] + 1 : 0; ans = Math.max(ans, dp[i][j]); } } return ans; } }
golang 解法, 执行用时: 40 ms, 内存消耗: 16 MB, 提交时间: 2022-12-06 13:34:57
func findLength(A []int, B []int) int { n, m := len(A), len(B) dp := make([][]int, n + 1) for i := 0; i < len(dp); i++ { dp[i] = make([]int, m + 1) } ans := 0 for i := n - 1; i >= 0; i-- { for j := m - 1; j >= 0; j-- { if A[i] == B[j] { dp[i][j] = dp[i + 1][j + 1] + 1 } else { dp[i][j] = 0 } if ans < dp[i][j] { ans = dp[i][j] } } } return ans }
python3 解法, 执行用时: 3356 ms, 内存消耗: 39.6 MB, 提交时间: 2022-12-06 13:34:43
''' 令 dp[i][j] 表示 A[i:] 和 B[j:] 的最长公共前缀,那么答案即为所有 dp[i][j] 中的最大值 ''' class Solution: def findLength(self, A: List[int], B: List[int]) -> int: n, m = len(A), len(B) dp = [[0] * (m + 1) for _ in range(n + 1)] ans = 0 for i in range(n - 1, -1, -1): for j in range(m - 1, -1, -1): dp[i][j] = dp[i + 1][j + 1] + 1 if A[i] == B[j] else 0 ans = max(ans, dp[i][j]) return ans