给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例 1:
输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度最长的公共子数组是 [3, 2, 1]。来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray
很遗憾,超时了。
参考官方题解。 按照我的理解,以元素本身开始的子数组。位于数组前面的元素理论上拥有比后面元素更长的重复子数组。例如以A[0]开始的重复子数组长度最长为5,而以A[4]为开始的重复子数组长度最长为1。所以本题可以采用从后向前转移的动态规划。 我们以一个二维数组来表示转移过程:(图解) 初始化: 大概示意图就是这样,是左上方传递,如果两个数相同,则两个元素指针都需要往前移,也就是斜上方。据此,我们可以推断出转移方程为:
dp[i][j]= A[I]==B[j]?dp[i+1][j+1]+1:0代码:
class Solution { public: int findLength(vector<int>& A, vector<int>& B) { int n = A.size(), m = B.size(); vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0)); int ans = 0; for (int i = n - 1; i >= 0; i--) { for (int j = m - 1; j >= 0; j--) { dp[i][j] = A[i] == B[j] ? dp[i + 1][j + 1] + 1 : 0; ans = max(ans, dp[i][j]); } } return ans; } };参考链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray 评论区里有一位大佬@newhar写了简约写法,代码省去不少。 参考链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/solution/zui-chang-zhong-fu-zi-shu-zu-by-leetcode-solution/