LeetCode718. 最长重复子数组
1. 问题描述
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
2. 思路
经典动态规划, 参考 最长公共子序列LeetCode1143
- dp[i][j]含义:以i-1结尾的A和以j-1结尾的B,最长重复子数组的长度为 dp[i][j]
- 递推公式:当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;
- 外层for循环遍历A,内层for循环遍历B
3. 代码
func findLength(A []int, B []int) int {
m, n := len(A), len(B)
dp := make([][]int, m + 1)
for i := 0; i < len(dp); i++ {
dp[i] = make([]int, n + 1)
}
res := 0
for i := 1; i <= m; i++ {
for j := 1; j <= n; j++ {
if A[i-1] == B[j-1] {
dp[i][j] = dp[i - 1][j - 1] + 1
}
if dp[i][j] > res {
res = dp[i][j]
}
}
}
return res
}
记录子数组版本
func findLength(A []int, B []int) int {
m, n := len(A), len(B)
dp := make([][]int, m + 1)
for i := 0; i < len(dp); i++ {
dp[i] = make([]int, n + 1)
}
res := 0
var end int
for i := 1; i <= m; i++ {
for j := 1; j <= n; j++ {
if A[i-1] == B[j-1] {
dp[i][j] = dp[i - 1][j - 1] + 1
}
if dp[i][j] > res {
res = dp[i][j]
end = i
}
}
}
// fmt.Println(end)
fmt.Println(A[end-res:end])
return res
}