Cool说丨力扣718

简介: [718. 最长重复子数组](https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/)

718. 最长重复子数组  经典

AB ,返回两个数组中公共的、长度最长的子数组的长度。

示例 1:

输入:

A: [1,2,3,2,1]

B: [3,2,1,4,7]

输出: 3

解释:

长度最长的公共子数组是 [3, 2, 1]。

说明:

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

 3 2 1 4 7

1 0 0 1 0 0

2 0 1 0 0 0

3 1 0 0 0 0

2 0 2 0 0 0

1 0 0 3 0 0

dpi代表以A[i-1]与B[j-1]结尾的公共字串的长度,公共字串必须以A[i-1],B[j-1]结束,即当A[i-1] == B[j-1]时,dpi = dpi-1 + 1; 当A[i-1] != B[j-1]时,以A[i-1]和B[j-1]结尾的公共字串长度为0,dpi = 0。输出最大的公共字串的长度即为最长重复字串。 打个表会更直观一点

第一版,最大公共子序列和子数组是不同的,DP解法

执行用时 :260 ms, 在所有 cpp 提交中击败了66.71%的用户

内存消耗 :106.1 MB, 在所有 cpp 提交中击败了58.93%的用户

intfindLength(vector<int>&A, vector<int>&B) {

   intlen1=A.size(), len2=B.size(),maxNum=0;

   vector<vector<int>>dp(len1 , vector<int>(len2 , 0));

   for (inti=0; i<len1; ++i) {

       for (intj=0; j<len2; ++j) {

           if (i==0||j==0) {

               dp[i][j] =A[i] ==B[j] ?1 : 0;

           }

           else    if (A[i] ==B[j])

           {

               dp[i][j] =dp[i-1][j-1] +1;

               maxNum=max(maxNum, dp[i][j]);

           }

           else

               dp[i][j]=0;

       }

   }

   returnmaxNum;

}

第二版,这是最大公共子序列的解法

 3 2 1 4 71 0 0 1 1 12 0 1 1 1 13 1 1 1 1 12 1 2 2 2 21 1 2 3 3 3

   intfindLength(vector<int>&A, vector<int>&B) {

   intlen1=A.size(), len2=B.size();

   vector<vector<int>>dp(len1 , vector<int>(len2 , 0));

   for (inti=0; i<len1; ++i) {

       if (A[i] ==B[0]) {

           while (i<len1)

               dp[i++][0] =1;

       }

   }

   for (intj=0; j<len2; ++j) {

       if (B[j] ==A[0]) {

           while (j<len2)

               dp[0][j++] =1;

       }

   }

   for (inti=1; i<len1; ++i) {

       for (intj=1; j<len2; ++j) {

           if (A[i] ==B[j])

               dp[i][j] =dp[i-1][j-1] +1;

           else

               dp[i][j] =max(dp[i-1][j],dp[i][j-1]);

       }

   }

   returndp[len1-1][len2-1];

   }


目录
相关文章
|
人工智能 C# C++
Cool说丨力扣153、454
153. 寻找旋转排序数组中的最小值 454. 四数相加 II
196 1
|
C# C++
Cool说丨力扣287/792/378
关注博主,获取更多知识
173 0
|
C# C++ 索引
Cool说丨力扣162
162. 寻找峰值
206 0
|
存储 C# C++
Cool说丨力扣29/34
关注博主。获取更多知识
171 0
|
存储 C# C++
Cool说丨力扣392
392. 判断子序列
145 0
|
C# C++
Cool说丨力扣744、704
744. 寻找比目标字母大的最小字母 704. 二分查找
218 0
|
C#
Cool说丨力扣475
475. 供暖器
171 0
|
机器学习/深度学习 算法 C#
Cool说丨力扣202
202. 快乐数
158 0
|
C#
Cool说丨力扣167
167. 两数之和 II - 输入有序数组
152 0
|
C# C++
Cool说丨力扣374、441
441. 排列硬币 374. 猜数字大小
161 0

热门文章

最新文章