https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例 1:
输入: 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
这个首先肯定想到的是循环,但是很难解决,不可能每个遍历一个数组的每个数又拿去到另一个数组遍历吧,这样时间复杂度直奔O(N^3)去了。
所以想想,是不是可以是父问题和子问题,貌似靠谱,那就试试动态规划了:
如果dp[i][j] 表示取A[i]结尾,B[j]结尾的子数组的最长重复子数组长度,则无法推到dp[i][j]和dp[i-1][j-1]的关系,因为无法确定到底是不是以A[i]B[j]作为最长重复子数组的一部分所以我们简单考虑,dp[i][j] 表示取A[i]结尾,B[j]结尾的子数组作为最长重复子数组时的最长重复子数组长度,则 : 如果A[i] = B[j],则dp[i][j] = dp[i-1][j-1] + 1否则 dp[i][j] = 0同时,我们在遍历过程中记录dp[i][j]最大值作为结果所以,用动态规划的时候最重要的就是想清楚到底dp[i]表示什么才能方便找到与dp[i-1]的关系,如果一种想不通必须立刻转换思路,否则会导致你陷进去,时间耗光了却找不到答案!
O(m * n)
O(m*n)
想想成两把尺子,拿一把尺子A从尺子B上方滑过,每次就拿B尺子的首元素和上方位置的A元素开始往后比。
思路动图详见滑动窗口解法
O(m*n)