题目链接
最长重复子数组
题目描述
注意点
解答思路
代码
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int m1 = nums1.length;
int m2 = nums2.length;
int max = 0;
int[][] dp = new int[m1 + 1][m2 + 1];
for(int i = m1 - 1;i >= 0;i--){
for(int j = m2 - 1;j >= 0;j--){
if(nums1[i] == nums2[j]){
dp[i][j] = dp[i + 1][j + 1] + 1;
max = dp[i][j] > max ? dp[i][j] : max;
}else{
dp[i][j] = 0;
}
}
}
return max;
}
}
关键点
- 理解动态规划的思想
从上一层的关系推出下一层的关系,在本题中,算nums1中索引i和nums2中索引j的最长重复子数组的方法是:如果nums1[[i]根本不等于nums2[j],那么其最长重复子数组肯定为0
如果nums1[[i]等于nums2[j],则需要根据nums1[i + 1]和nums1[j + 1]的最长重复子数组的基础上再加1就是nums1[i]和nums1[j]的最长重复子数组,所以需要从后往前遍历,并且用一个数组dp储存每一层的最长重复子数组的值,不断向前遍历到nums1[0]和nums2[0],再从数组dp中找到最大值