5.23算法练习最长重复子数组#动态规划
Posted 在路上的德尔菲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.23算法练习最长重复子数组#动态规划相关的知识,希望对你有一定的参考价值。
题目
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例
输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出:3
解释:
长度最长的公共子数组是 [3, 2, 1] 。
解题
和上一篇文章《最长公共子序列》异曲同工之妙,如果没有读建议先去读上一篇文章。
伪代码如下
if(text1[i] == text2[j]){
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = 0;
}
根据伪代码可以画出下面的表格,因为此题是要求最长连续相同的子数组,如果中间断了就要从0开始计数,如果完全匹配就会在表格中看到从左上角到右下角一条逐步增大值的线。
1 | 2 | 3 | 2 | 1 | |
---|---|---|---|---|---|
3 | 0 | 0 | 1 | 0 | 0 |
2 | 0 | 1 | 0 | 2 | 0 |
1 | 1 | 0 | 0 | 0 | 3 |
4 | 0 | 0 | 0 | 0 | 0 |
7 | 0 | 0 | 0 | 0 | 0 |
代码如下
public int findLength(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int[][] dp = new int[m + 1][n + 1];
int res = 0;
for (int i = 1; i <= m; i++) {
int num1 = nums1[i - 1];
for (int j = 1; j <= n; j++) {
int num2 = nums2[j - 1];
if (num1 == num2) {
dp[i][j] = dp[i - 1][j - 1] + 1;
//记录结果
res = Math.max(res, dp[i][j]);
} else {
dp[i][j] = 0;
}
}
}
return res;
}
小结
动态规划绘制单元格要注意:
- 单元格中的值是什么?
- 如何将这个问题划分为子问题?即单元格之间的关系是什么
- 网格的坐标轴是什么?
这些问题都搞明白了,那么代码就很容易写了。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
以上是关于5.23算法练习最长重复子数组#动态规划的主要内容,如果未能解决你的问题,请参考以下文章