718. 最长重复子数组
力扣链接(中等):https://leetcode.cn/problems/maximum-length-of-repeated-subarray
给两个整数数组 nums1
和 nums2
,返回 两个数组中 公共的 、长度最长的子数组的长度 。
示例 1:
Text Only |
---|
| 输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。
|
示例 2:
Text Only |
---|
| 输入: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
个人题解
C++ |
---|
| class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
const int N = 1010;
int dp[N][N] = {};
int result = 0;
// 初始化
// nums1 长度为 1 时
for(int i = 0; i < nums2.size(); i++) {
if(nums1[0] == nums2[i]) {
dp[0][i] = 1;
result = dp[0][i];
}
}
// nums2 长度为 1 时
for(int i = 0; i < nums1.size(); i++) {
if(nums1[i] == nums2[0]) {
dp[i][0] = 1;
result = dp[i][0];
}
}
for(int i = 1; i < nums1.size(); i++) {
for(int j = 1; j < nums2.size(); j++) {
if(nums1[i] == nums2[j]) dp[i][j] = dp[i - 1][j - 1] + 1;
result = max(result, dp[i][j]);
}
}
// dp 调试用
// for(int i = 0; i < nums1.size(); i ++){
// for(int j = 0; j < nums2.size(); j++) cout << dp[i][j] << ' ';
// cout << endl;
// }
return result;
}
};
|