问题分析
查找两个数组的最大公共子数组,要求返回的子数组是连续的。
输入:A = [3,1,3,2,1,4], B = [3,2,3,2,1,4]
输出:[3,2,1,4]
输入:A = [3,1,3,2,1,4], B = [3,2,3,1]
输出:[3,2]
或 [3,1]
C++代码
动态规划,同两个字符串的编辑距离、最长公共子序列LCS 解法一样。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> getLongestSubVector(vector<int> vec1, vector<int> vec2) {
int m = vec1.size();
int n = vec2.size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
int max_i = -1;
int max_len = -1;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (vec1[i - 1] == vec2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
if (dp[i][j] > max_len) {
max_len = dp[i][j];
max_i = i;
}
} else {
dp[i][j] = 0;
}
}
}
return max_len == -1 ? vector<int>() : vector<int>(vec1.begin() + max_i - max_len, vec1.begin() + max_i);
}
int main(){
vector<int> vec1 = {3,1,3,2,1,4};
vector<int> vec2 = {3,2,3,1,2};
vector<int> res = getLongestSubVector(vec1, vec2);
for(int i = 0; i < res.size(); i++){
if(i != 0){
cout << ", ";
}
cout << res[i];
}
cout << endl;
cout << "Hello, World!" << endl;
return 0;
}
代码分析
时间复杂度:O(mn),二维动态规划,m是 A 数组长度,n 是 B 数组长度;
空间复杂度:O(mn),创建了一个(m+1)✖️(n+1) 的 dp 数组。