最长公共子数组(数组,动态规划)

GitHub:github.com/bllon/Data-structure-an...
题目:

最长公共子数组(连续的)
求给定的两个数组的最长公共子数组
例如 arr1 = [1,2,4,6,9,13], arr2 = [1,3,4,6,9,15]
那么最长公共子数组为[4,6,9]

分析:

此题目可用动态规划来解决
dp[i][j]表示arr1中i位置和arr2中j位置前时(不包含当前位置)最长公共子数组的长度
dp[i][j] = dp[i-1][j-1] + 1     条件: arr1[i-1] == arr2[j-1](当两个位置前面的值相等时)

代码:

func LCS(arr1, arr2 []int) []int {
    len1, len2 := len(arr1), len(arr2)
    if len1 == 0 || len2 == 0 {
        return nil
    }

    var dp [][]int
    dp = make([][]int, len1 + 1)    //长度都加1, 满足下面等于len1的情况
    for i := 0; i <= len1; i++ {
        dp[i] = make([]int, len2 + 1)
    }

    var result, index int
    result, index = -1 , -1
    for i := 1; i <= len1; i++ {
        for j := 1; j <= len2; j++ {
            if arr1[i-1] == arr2[j-1] {
                dp[i][j] = dp[i-1][j-1] + 1
            }
            if dp[i][j] > result {
                index = i    //最长公共子数组的最后一个索引加1的位置,也可以用j
                result = dp[i][j]    //最长公共子数组的长度
            }
        }
    }

    if index == -1 {
        return nil
    }
    return arr1[index-result:index]    //根据索引位置得出最长公共子数组
}

func main() {
   fmt.Println(LCS([]int{1,2,4,6,9,13}, []int{1,3,4,6,9,15}))
   return
}

最终输出:

[4 6 9]

算法作用:

该算法可用于 字符串匹配,生物信息学,数据压缩
本作品采用《CC 协议》,转载必须注明作者和本文链接
GitHub地址:github.com/bllon
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!