赞
踩
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例 1:
输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出: 3
解释:
长度最长的公共子数组是 [3, 2, 1]。
说明:
1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100
思路分析: 这显然是一道动态规划的题,蛋式可能会有很大一部分的道友做错,会把“子数组”、“子序列”混淆。“子数组”要求连续,“子序列”并不要求连续。所以dp[i][j]应该表示当A[i - 1] == B[j - 1]时,A[0, i -1],B[0, j - 1]连续的重复子数组长度。
class Solution { public: int findLength(vector<int>& A, vector<int>& B) { int Asize = A.size(), Bsize = B.size(), maxRes = 0; //dp[i][j]表示当A[i - 1] == B[j - 1]时,A[0, i -1],B[0, j - 1]连续的重复子数组长度 vector<vector<int>> dp(Asize + 1, vector<int>(Bsize + 1, 0)); for (int i = 1; i <= Asize; ++i) { for (int j = 1; j <= Bsize; ++j) { if (A[i - 1] == B[j - 1]) { //当A[i - 1] == B[j - 1],才能将dp[i - 1][j - 1](A[i - 2] == B[j - 2]时,A[0, i -2],B[0, j - 2]连续的重复子数组长度)串接 dp[i][j] = dp[i - 1][j - 1] + 1; maxRes = max(maxRes, dp[i][j]);//更新最大值 } //否则dp[i][j] = 0(初始化就是0) } } return maxRes; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。