给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。
示例 1:
输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。
示例 2:
输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
输出:5
动态规划解法
1.从后往前:
dp[i][j]表示a[i:]b[j:]最长公共前缀;
class Solution {
public:
int findLength(vector<int>& a, vector<int>& b) {
int n=a.size(),m=b.size();
vector<vector<int>> dp(n+1,vector<int>(m+1,0));
int ans=0;
for(int i=n-1;i>=0;i--){
for(int j=m-1;j>=0;j--){
dp[i][j]=a[i]==b[j] ? dp[i+1][j+1]+1:0;
ans=max(ans,dp[i][j]);
}
}
return ans;
}
};
2.从前往后:
dp[i][j]
:长度为i
,末尾项为A[i-1]
的子数组,与长度为j
,末尾项为B[j-1]
的子数组,二者的最大公共后缀子数组长度。//从1开始
for (int i = 1; i <= nums1.length; i++) {
for (int j = nums2.length; j > 0; j--) {
dp[i][j]=a[i-1]==b[j-1] ? dp[i-1][j-1]:0;
滑动窗口
class Solution {
public:
int maxlen(vector<int>& nums1, vector<int>& nums2) {
int ans=0;
int n=nums1.size(),m=nums2.size();
for(int i=0;i<n;i++){
int maax=0;
int temp=0;
for(int j=0;j<m && i+j<n;j++){
if(nums1[i+j]==nums2[j])
temp++;
else temp=0;
maax=max(temp,maax);
}
ans=max(maax,ans);}
return ans; }
int findLength(vector<int>& nums1, vector<int>& nums2) {
return max(maxlen(nums1,nums2),maxlen(nums2,nums1));
}
};