LeetCode 题解:718. 最长重复子数组,动态规划,JavaScript,详细注释
原题链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/
解题思路:
假设
A
的长度为m
,B
的长度为n
。我们可以创建一个(m+1)*(n+1)
矩阵dp
,为避免递推第一个值时索引出现负数,dp
矩阵要创建第一行和第一列的初始值0
,避免边界判断。
将A
和B
排列如下图:
对于
A
的任意索引i - 1
,B
的任意索引j - 1
,如果A[i - 1] === B[j - 1]
,当前子数组长度只需要在之前已知的公共子数组长度上加 1。如果不相等,当前统计的长度就为 0.状态转移方程如下:
复制代码
复制代码
推导结果如下图:
由于
dp[i][j]
只与dp[i - 1][j - 1]
,也就是左上角的状态有关,因此dp
矩阵可以优化成一个数组。
复制代码
版权声明: 本文为 InfoQ 作者【Lee Chen】的原创文章。
原文链接:【http://xie.infoq.cn/article/00ddf5c6a8dfaf22addeac283】。文章转载请联系作者。
评论