最长重复子数组

题目

给两个整数数组 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;
    }
};
posted @ 2023-07-25 11:13  铜锣湾陈昊男  阅读(92)  评论(0)    收藏  举报