718. 最长重复子数组(dp)

 

给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

 

示例:

输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出:3
解释:
长度最长的公共子数组是 [3, 2, 1] 。

 

提示:

  • 1 <= len(A), len(B) <= 1000
  • 0 <= A[i], B[i] < 100

 

 

 

 

 

 

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {

        int n1 = nums1.size();
        int n2 = nums2.size();
        int res = 0;
        vector<vector<int>> dp = vector<vector<int>>(n1+1,vector<int>(n2+1,0));
        for(int i = 1; i <= n1; i++) {
            for(int j = 1; j <= n2;j++) {
                if (nums1[i-1]==nums2[j-1]) {
                    dp[i][j] = 1 + dp[i-1][j-1];
                } else {
                    dp[i][j] = 0;
                }
                res = max(res,dp[i][j]);

            }
        }
        return res;
        
    }
};

 

代码

 1 class Solution {
 2 public:
 3     int findLength(vector<int>& nums1, vector<int>& nums2) {
 4         int n = nums1.size();
 5         int m = nums2.size();
 6         int dp[n+1][m+1];
 7         //dp[i][j] 以i,j 为结尾的最长公共子串, 要求连续,所以不是从0到i是最长。
 8         //最终结果是 max(dp[i][j])
 9         for(int i = 0; i < n+1;++i) {
10             dp[i][0] = 0;
11         }
12         for(int j = 0; j < m+1;++j) {
13             dp[0][j] = 0;
14         } 
15         int res = 0;
16         for(int i =1 ;i < n+1;++i) {
17             for(int j = 1;j < m+1;++j) {
18                 if(nums1[i-1]==nums2[j-1]) {
19                     dp[i][j] = 1+dp[i-1][j-1];
20                 } else {
21                     dp[i][j] = 0; // 区别与最长子序列, s[i]!=ss[j],那么这2个子串没有公共子串
22                     // [1,2,3] vs [1,2] 没有公共子串
23                     // [1,2,3]以i为结尾的子串=[1,2,3]\[2,3]、[3]
24                     // [1,2]以i为结尾的子串=[1,2]\[2]
25                 }
26                 res = max(res,dp[i][j]);
27             }
28         }
29         return res;
30     }
31 };

 

posted @ 2021-09-15 10:07  乐乐章  阅读(49)  评论(0编辑  收藏  举报