We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
给两个整数数组 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
1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
定义 dp[i][j] 为数组 A 从 i 开始往后,且数组 B 从 j 开始往后的两个子数组所得到的最长子数组的长度。
dp[i][j]
i
j
如果 A[i] === B[i],那么 dp[i][j] 就等于 1 + dp[i + 1][j + 1],也就是两个数组的起点各往后移一位后的最长子数组长度,如果它们不相等,那么可以直接得到 dp[i][j] = 0。因为这两位为起点无法组成重复子数组。
A[i] === B[i]
1 + dp[i + 1][j + 1]
dp[i][j] = 0
注意这里我初始化的时候的循环条件都是 i <= al 这样超出一位的,把超出边界的一位初始化为 0,是为了 i = A.length - 1 这种情况下,也就是其中的一个数组的最后一位比较的时候,假设这时候 A[i] = B[j] 了,那么会去找 1 + dp[i + 1][j + 1] 此时超出了边界,但是这种情况下完全可以把 1 + 0 作为结果,也就是最长子数组长度为 1。这样就巧妙的处理了边界情况。
i <= al
i = A.length - 1
A[i] = B[j]
1 + 0
/** * @param {number[]} A * @param {number[]} B * @return {number} */ let findLength = function (A, B) { let dp = [] let al = A.length let bl = B.length for (let i = 0; i <= al; i++) { dp[i] = [] for (let j = 0; j <= bl; j++) { dp[i][j] = 0 } } let max = 0 for (let i = al - 1; i >= 0; i--) { for (let j = bl - 1; j >= 0; j--) { let a = A[i] let b = B[j] if (a === b) { dp[i][j] = dp[i + 1][j + 1] + 1 max = Math.max(max, dp[i][j]) } else { dp[i][j] = 0 } } } return max }
The text was updated successfully, but these errors were encountered:
No branches or pull requests
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
说明:
1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
定义
dp[i][j]
为数组 A 从i
开始往后,且数组 B 从j
开始往后的两个子数组所得到的最长子数组的长度。如果
A[i] === B[i]
,那么dp[i][j]
就等于1 + dp[i + 1][j + 1]
,也就是两个数组的起点各往后移一位后的最长子数组长度,如果它们不相等,那么可以直接得到dp[i][j] = 0
。因为这两位为起点无法组成重复子数组。注意这里我初始化的时候的循环条件都是
i <= al
这样超出一位的,把超出边界的一位初始化为 0,是为了i = A.length - 1
这种情况下,也就是其中的一个数组的最后一位比较的时候,假设这时候A[i] = B[j]
了,那么会去找1 + dp[i + 1][j + 1]
此时超出了边界,但是这种情况下完全可以把1 + 0
作为结果,也就是最长子数组长度为 1。这样就巧妙的处理了边界情况。The text was updated successfully, but these errors were encountered: