最长重复子数组
题目
给两个整数数组 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
代码
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
//动态规划的题目,因为我们可以逐步增加数组1和数组2的长度,然后逐步推导
/*dp数组的含义同样和前面一样需要特别的设定,dp[i][j]表
示nums1下标是i(包括i),和nums2下标是j结尾的最长的子数组长度
其实可以看出nums1[i] == nums2[j],dp才能增加长度
*/
//dp递推公式,if(nums1[i] == nums2[j])dp[i][j] = dp[i - 1][j - 1] + 1
/*初始化,如果dp这样定义就会出现初始化的问题,那么改变一下dp数组的含义,变成
dp[i][j] 表示的是以i - 1和j - 1 结尾的最长数组的长度,那么递推公式变成:
if(nums1[i - 1] == nums2[j - 1])dp[i][j] = dp[i - 1][j - 1] + 1
初始化是,dp[i][0] = 0,dp[0][j] = 0
*/
vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
int result = 0;
for(int i = 1; i < nums1.size() + 1; i++) {
for(int j = 1; j < nums2.size() + 1; j++) {
if(nums1[i - 1] == nums2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
if (dp[i][j] > result) result = dp[i][j];
}
}
return result;
}
};

浙公网安备 33010602011771号