LeetCode 718
https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/
难度:中等
高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/
类似最长公共子序列,这题是求连续子数组。定义 f[i+1][j+1] 表示以 nums1[i] 结尾的子数组和以 nums2[j] 结尾的子数组的最长公共子数组的长度。
如果 nums1[i] != nums2[j],那么 f[i+1][j+1]=0。
如果 nums1[i] == nums2[j],那么问题变成以 nums1[i−1] 结尾的子数组和以 nums2[j−1] 结尾的子数组的最长公共子数组的长度,即 f[i+1][j+1]=f[i][j]+1。相当于在以 nums1[i−1] 结尾的子数组后面添加 nums1[i],在以 nums2[j−1] 结尾的子数组后面添加 nums2[j]。
初始值:f[0][j]=f[i][0]=0,空子数组没有公共部分。
答案:所有 f[i][j] 的最大值。
时间复杂度:O(nm),其中 n 是 nums1 的长度,m 是 nums2 的长度。 空间复杂度:O(nm)。
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
int n = nums1.size(), m = nums2.size(), ans = 0;
vector f(n + 1, vector<int>(m + 1));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (nums1[i] == nums2[j]) {
f[i + 1][j + 1] = f[i][j] + 1; // 递推关系
ans = max(ans, f[i + 1][j + 1]);
}
}
}
return ans;
}
};