mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
update 0718.最长重复子数组:优化文本错字,增加 go 的滚动数组代码
This commit is contained in:
@ -28,7 +28,7 @@
|
||||
|
||||
注意题目中说的子数组,其实就是连续子序列。
|
||||
|
||||
要求两个数组中最长重复子数组,如果是暴力的解法 只要需要先两层for循环确定两个数组起始位置,然后在来一个循环可以是for或者while,来从两个起始位置开始比较,取得重复子数组的长度。
|
||||
要求两个数组中最长重复子数组,如果是暴力的解法 只需要先两层for循环确定两个数组起始位置,然后再来一个循环可以是for或者while,来从两个起始位置开始比较,取得重复子数组的长度。
|
||||
|
||||
本题其实是动规解决的经典题目,我们只要想到 用二维数组可以记录两个字符串的所有比较情况,这样就比较好推 递推公式了。
|
||||
动规五部曲分析如下:
|
||||
@ -163,7 +163,7 @@ public:
|
||||
|
||||
当然可以,就是实现起来麻烦一些。
|
||||
|
||||
如果定义 dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,那么 第一行和第一列毕竟要经行初始化,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1, 因为此时最长重复子数组为1。 nums2[j] 与 nums1[0]相同的话,同理。
|
||||
如果定义 dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,那么 第一行和第一列毕竟要进行初始化,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1, 因为此时最长重复子数组为1。 nums2[j] 与 nums1[0]相同的话,同理。
|
||||
|
||||
所以代码如下:
|
||||
|
||||
@ -298,6 +298,29 @@ func findLength(A []int, B []int) int {
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// 滚动数组
|
||||
func findLength(nums1 []int, nums2 []int) int {
|
||||
n, m, res := len(nums1), len(nums2), 0
|
||||
dp := make([]int, m+1)
|
||||
for i := 1; i <= n; i++ {
|
||||
for j := m; j >= 1; j-- {
|
||||
if nums1[i-1] == nums2[j-1] {
|
||||
dp[j] = dp[j-1] + 1
|
||||
} else {
|
||||
dp[j] = 0 // 注意这里不相等要赋值为0,供下一层使用
|
||||
}
|
||||
res = max(res, dp[j])
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
func max(a, b int) int {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
```
|
||||
|
||||
JavaScript:
|
||||
|
Reference in New Issue
Block a user