718. 最长重复子数组 中等
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例:
输入:
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
代码参考:
package main
import "fmt"
func main() {
fmt.Println(findLength([]int{0, 1, 1, 1, 1}, []int{1, 0, 1, 0, 1})) // 2
fmt.Println(findLength([]int{0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, []int{0, 0, 0, 0, 0, 0, 0, 1, 0, 0})) // 9
}
// 最直观也是最辣鸡的做法
func findLength(A []int, B []int) int {
m := make(map[int][]int)
for i, b := range B {
m[b] = append(m[b], i) // 存储 B 数组中所有元素的索引
}
maxLen := 0
for i, a := range A {
if _, ok := m[a]; !ok { // 不存在与 B 数组中
continue
}
// 向后遍历
for _, start := range m[a] {
curLen := 0
ai := i
for bi := start; ai < len(A) && bi < len(B); ai, bi = ai+1, bi+1 { // 连续相同的子数组计数
if A[ai] != B[bi] {
break
}
curLen++
}
if maxLen < curLen {
maxLen = curLen
}
}
}
return maxLen
}
最后编辑: kuteng 文档更新时间: 2021-06-05 10:16 作者:kuteng