题目链接
题目描述
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例:
输入:
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
思路
和最长公共子串问题相似,可以使用动态规划,设两个数组长度分别为len1、len2,可以用一个大小为len1*len2的二维矩阵来记录当前公共子串长度,当两个字符相同时就将arr[i][j]设为左上角的a[i-1][j-1]+1;如果已经在最左上角,那就设为1。
最终,矩阵中最大的值即答案。
代码如下:
时间复杂度:O(mn)
空间复杂度:O(mn)
class Solution {
public:
int findLength(vector<int>& A, vector<int>& B) {
int len1=A.size(),len2=B.size(),ans=0;
vector<vector<int> > arr(len1);
for(auto &i:arr)
i.resize(len2,0);
for(int i=0;i<len1;i++)
for(int j=0;j<len2;j++){
if(A[i]==B[j])
arr[i][j]= i!=0&&j!=0? arr[i-1][j-1]+1:1;
if(arr[i][j]>ans)
ans=arr[i][j];
}
return ans;
}
};