给两个整数数组 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
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
//和一个数组内比较思路相似。
//这里是两个数组找最长重复的子数组。那么dp数组就是二维的
//dp[i][j]:以1[i-1]为结尾的 字符串 和 以2[j-1]为结尾的字符串 最长重复子数组长度为dp[i][j];
//递推关系:由于是子数组,连续的。因此dp[i][j]的状态只与前一个有关。
//所以 当nums[i-1] == nums[j-1] dp[i][j] = max(dp[i-1][j-1]+1, dp[i][j]);
//由于是连续的子数组,所以只能由前一个推出来。
//初始化。dp[i][0] 由于0-1已经越界了,可以理解为和空数组重复数组为0;
vector<vector<int>>dp(nums1.size()+1,vector<int>(nums2.size()+1,0));
int res = 0;
for(int i = 1;i <= nums1.size();i++){
// 最后一个元素 dp[i][j]=dp[nums1.size()-1][nums2.size()-1];所以需要<=
for(int j = 1; j <= nums2.size();j++){
if(nums1[i-1] == nums2[j-1]){
dp[i][j] = max(dp[i][j], dp[i-1][j-1] + 1);
}
res = max(res,dp[i][j]);
}
}
return res;A
}
};