2023.8.24
本题求得子数组,其实就是连续的序列。定义一个二维dp数组,dp[i][j]的含义为:以下标i为结尾的nums1和以下标j为结尾的nums2之间的公共最长子数组。 易得:递推公式为dp[i][j] = dp[i-1][j-1] + 1; 由此可以看出当前状态是要依赖于数组“左上角”,所以需要初始化第一行和第一列,然后再遍历和赋值。 代码如下:
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(nums1.size(),vector<int>(nums2.size(),0));
int ans = 0;
//初始化第一行第一列
for(int i=0; i<nums2.size(); i++)
{
if(nums1[0] == nums2[i]) dp[0][i] = 1;
ans = max(ans,dp[0][i]);
}
for(int i=0; i<nums1.size(); i++)
{
if(nums2[0] == nums1[i]) dp[i][0] = 1;
ans = max(ans,dp[i][0]);
}
//遍历
for(int i=1; i<nums1.size(); i++)
{
for(int j=1; j<nums2.size(); j++)
{
if(nums1[i] == nums2[j])
{
dp[i][j] = dp[i-1][j-1] + 1;
ans = max(ans,dp[i][j]);
}
}
}
return ans;
}
};