给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。
解题思路:动态规划
(1) 定义dp数组
dp[i][j]:以nums1[i]结尾的连续子数组,和 以nums2[j]结尾的连续子数组,它们的公共最长子数组长度。
(2) 状态转移方程
● 当 nums1[i] == nums2[j] 时:dp[i][j] = dp[ i-1 ][ j-1] + 1
● 当 nums1[i] != nums2[j] 时:dp[i][j] = 0
(3) 初始化
● 当 i == 0 或者 j == 0 时,因为无法获得 i-1、j-1,此时:
nums1[i] == nums2[j],dp[i][j] = 1
nums1[i] != nums2[j],dp[i][j] = 0
(4) 遍历顺序
从状态转移方程可以看出,需要依赖左上角。因此:从上到下,从左到右
(5) 举例:略
⭕ 注意:答案要求两个数组中最长公共连续子数组长度,因此任意一个dp[i][j]都有可能成为解,要保存dp[i][j]中的最大值!
class Solution {
public int findLength(int[] nums1, int[] nums2) {
// dp[i][j] = 以nums1[i]结尾的连续子数组,和 以nums2[j]结尾的连续子数组,它们的公共最长子数组长度
int len1 = nums1.length;
int len2 = nums2.length;
int[][] dp = new int[len1][len2];
int result = 0;
for(int i=0; i<len1; i++){
for(int j=0; j<len2; j++){
if(nums1[i] == nums2[j]){
if(i == 0 || j == 0) dp[i][j] = 1;
else dp[i][j] = dp[i-1][j-1] + 1;
}
else dp[i][j] = 0;
result = Math.max(result, dp[i][j]);
}
}
// 结果可以是任意一个dp[i][j]
return result;
}
}