这个题目和最长公共子数组,类似于镜像题,子问题比较难想。对于 d p [ i ] [ j ] dp[i][j] dp[i][j] ,定义为分别以 i i i 和 j j j 结尾的最长公共子数组(公共后缀)
核心代码:
if(nums1[i-1] == nums2[j-1]){dp[i][j] = dp[i-1][j-1]+1;if(dp[i][j] > ans)ans = dp[i][j];
}
else dp[i][j] = 0;
注意,和最长公共子序列不同的是,最后一个元素如果不相同,那 d p [ i ] [ j ] dp[i][j] dp[i][j] 需要赋值为0。其实相当于最长公共子序列的一个变种,核心代码和最长公共子序列一致。
typedef vector<int> V;
class Solution {
public:int findLength(vector<int>& nums1, vector<int>& nums2) {int n1 = nums1.size(), n2 = nums2.size();int ans = 0;vector<V> dp(n1+1, V(n2+1, 0));for(int i=1;i<=n1;i++){for(int j=1;j<=n2;j++){if(nums1[i-1] == nums2[j-1]){dp[i][j] = dp[i-1][j-1]+1;if(dp[i][j] > ans)ans = dp[i][j];}else dp[i][j] = 0;}}return ans;}
};