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