问题概述
解题思路
这题的暴力解法是O()时间复杂度。首先遍历nums1数组,然后对每个元素a1,遍历nums2数组,找与之相等的元素,开始统计两者的公共长度。
一种动态规划的解法是O()时间复杂度。用二维数组dp[i][j]来统计nums1数组的第i个元素开头、nums2数组的第j个元素开头的公共子串长度,这样可以写出递推公式:
不过看到这个递推式子,我觉得可以写出空间复杂度为O()的方法。参考解法
算法性能
二维dp,时空复杂度为O():
一维dp,空间复杂度为O(n):
示例代码
二维dp,时空复杂度为O():
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2)
{
int res = 0;
int M = nums1.size(), N = nums2.size();
int **dp = new int*[M + 1];
for(int i = 0; i < M + 1;++i)
{
dp[i] = new int[N + 1];
for(int j = 0;j < N+1;++j)
{
dp[i][j] = 0;
}
}
for(int i = M - 1; i >= 0; --i)
{
for(int j = N - 1; j >=0; --j)
{
if(nums1[i] == nums2[j])
dp[i][j] = dp[i + 1][j + 1] + 1;
res = max(dp[i][j], res);
}
}
return res;
}
};
一维dp,时空复杂度为O(n):
class Solution {
public:
int findLength(vector<int>& A, vector<int>& B) {
int m = A.size();
int n = B.size();
if (!m || !n) {
return 0;
}
vector<int> dp(n+1,0);
int res = 0;
for (int i = m-1; i >=0; i--) {
for (int j = 0; j < n; j++) {
dp[j] = (A[i] == B[j]) ? dp[j + 1] + 1 : 0;
res = max(res, dp[j]);
}
}
return res;
}
};