leetcode 718 最长公共子数组
这个题目和最长公共子数组,类似于镜像题,子问题比较难想。对于
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;
}
};