题目
给两个整数数组 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
暴力解法
首先看一下暴力解法.
使用下标i
遍历数组A
, 使用下标j
遍历数组B
. 寻找以元素A[i]
和B[j]
为首的最长公共数组长度$s_{ij}$, 那么全局的最长公共数组长度为
代码如下
1 | class Solution { |
时间复杂度为$O(n^3)$
动态规划
在暴力解法当中, 元素A[i]
和元素B[j]
会进行多次比较. 可以利用动态规划来进行优化, 使得元素A[i]
和元素B[j]
只会进行一次比较.
令dp[i][j]
为元素A[i]
和元素B[j]
的最长公共重复子数组长度. 那么我们可以知道, 若A[i]==B[j]
, 则有dp[i][j]=dp[i+1][j+1]+1
; 若A[i]!=B[j]
, 则有dp[i][j]=0
. 由于dp[i][j]
依赖于dp[i+1][j+1]
, 所以i
和j
需要从后往前遍历.
代码如下
1 | class Solution { |
滑动窗口
如图所示, 分别枚举数组A
向右移动和数组B
向右移动的所有情况, 然后计算红框内最大的公共数组长度.
代码如下所示
1 | class Solution { |