update 0718.最长重复子数组:优化文本错字,增加 go 的滚动数组代码

This commit is contained in:
Yuhao Ju
2022-12-29 22:40:18 +08:00
committed by GitHub
parent aa00784693
commit 2afe2709a7

View File

@ -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