-
Notifications
You must be signed in to change notification settings - Fork 12.3k
Open
Description
本题提供了两种dp定义:
dp[i][j]表示以i-1结尾的数组1和以j-1为结尾的数组2的最长重复子数组dp[i][j]表示以i结尾的数组1和以j为结尾的数组2的最长重复子数组
每种定义有不同的写法。但不论是哪一种,根据代码计算出来的dp[i][j]都不符合它的定义。
这里以第二种为例,以下是第二种定义对应的代码:
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp (nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
int result = 0;
// 要对第一行,第一列经行初始化
for (int i = 0; i < nums1.size(); i++) if (nums1[i] == nums2[0]) dp[i][0] = 1;
for (int j = 0; j < nums2.size(); j++) if (nums1[0] == nums2[j]) dp[0][j] = 1;
for (int i = 0; i < nums1.size(); i++) {
for (int j = 0; j < nums2.size(); j++) {
if (nums1[i] == nums2[j] && i > 0 && j > 0) { // 防止 i-1 出现负数
dp[i][j] = dp[i - 1][j - 1] + 1;
}
if (dp[i][j] > result) result = dp[i][j];
}
}
return result;
}
};
Metadata
Metadata
Assignees
Labels
No labels
