思路:用动态规划的思路,即建立dp[n][m],其中n表示nums1的长度,m表示表示nums2的长度,
首先明确:d[i][j]的意义,他表示以nums1[i]元素结尾的字符串和以nums2[j]元素结尾的字符串他们的重复子数组的最大长度。
其次:当nums1[i]==nums2[j]时,dp[i][i]=dp[i-1][j-1]+1;
dp初始化,首先我们只初始化dp[i][0]和dp[0][j],当nums1[0]==nums2[i]时dp[0][i]=1,当nums1[i]==nums2[0]时dp[i][0]=1。其余的点先全部取0.
然后开始遍历,两层for,i=1,j=1开始。
最后找出dp数组里面的最大值即可。
代码如下:
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size();
int m=nums2.size();
vector<vector<int>> dp(n,vector<int> (m,0));
//初始化dp
for(int i=0;i<n;i++){
if(nums1[i]==nums2[0]){
dp[i][0]=1;
}
}
for(int i=0;i<m;i++){
if(nums1[0]==nums2[i]){
dp[0][i]=1;
}
}
//开始遍历求解
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
if(nums1[i]==nums2[j]){
dp[i][j]=dp[i-1][j-1]+1;
}
}
}
//查询结果
int ans=dp[0][0];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
ans=max(ans,dp[i][j]);
}
}
return ans;
}
};
标签:初始化,718,int,重复子,力扣,vector,dp,nums1,nums2
From: https://blog.csdn.net/m0_72174153/article/details/144275755