###### tags: `Leetcode` `medium` `dynamic programming` `python` `c++` # 718. Maximum Length of Repeated Subarray ## [題目連結:] https://leetcode.com/problems/maximum-length-of-repeated-subarray/ ## 題目: Given two integer arrays ```nums1``` and ```nums2```, return the maximum length of a subarray that appears in **both** arrays. **Example 1:** ``` Input: nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7] Output: 3 Explanation: The repeated subarray with maximum length is [3,2,1]. ``` **Example 2:** ``` Input: nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0] Output: 5 Explanation: The repeated subarray with maximum length is [0,0,0,0,0]. ``` ## 解題想法: * 此題為給兩組數組,求連續的最長重複數組長度 * 求Longest Common Substring * 使用DP: * 定義: dp[i][j]表示nums1[:i]與nums2[:j]的最長subarray * 轉移方程: * if nums1[i-1]==nums2[j-1]: * dp[i][j]=dp[i-1][j-1]+1 * else: * dp[i][j]=0 * ex: ``` nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7] 多一行一列存0 所以真正該對應位置是nums1[i-1] nums2[j-1] x 3 2 1 4 7 x 0 0 0 0 0 0 1 0 0 0 1 0 0 2 0 0 1 0 0 0 3 0 1 0 0 0 0 2 0 0 2 0 0 0 1 0 0 0 3 0 0 ``` ## Python: ``` python= class Solution(object): def findLength(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: int """ m=len(nums1) n=len(nums2) res=0 #dp[i][j]表示nums1[:i]與nums2[:j]的最長subarray dp=[ [0 for _ in range(n+1)] for _ in range(m+1)] for i in range(1,m+1): for j in range(1,n+1): #多一行一列存0 所以真正該對應位置是nums1[i-1] nums2[j-1] if nums1[i-1]==nums2[j-1]: dp[i][j]=dp[i-1][j-1]+1 res=max(res,dp[i][j]) else: dp[i][j]=0 print(dp) return res result=Solution() ans=result.findLength(nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]) print(ans) ``` ## C++: ``` cpp= #include<bits/stdc++.h> using namespace std; class Solution { public: int findLength(vector<int>& nums1, vector<int>& nums2) { int m=nums1.size(); int n=nums2.size(); int res; vector<vector<int>> dp(m+1, vector<int>(n+1, 0)); for (int i=1; i<m+1; i++){ for (int j=1; j<n+1; j++){ dp[i][j]= (nums1[i-1]==nums2[j-1])? dp[i-1][j-1]+1 : 0; res=max(res, dp[i][j]); } } return res; } }; ```