思路 :子序列问题首先的大方向就是动态规划,本题有两个目标数组,要在其中找出两个数组 公共的 、长度最长的子数组的长度。所以我们在设置dp数组的时候,也应当设置二维的dp数组用于表示两个数组中不同的下标,dp[i][j]的含义也就是以nums1[i-1]结尾 nums2[j-1]结尾的最长相同子序列的长度(遍历从1开始,且nums数组从0开始),递推公式很明显为
dp[i][j] = dp[i -1][j-1] + 1;
因为dp数组是二维的,所以我们在遍历的时候需要进行双重for循环,在本题中哪一个数组先遍历都可以,值得注意的是递推公式中出现了i-1,j-1所以遍历要从1开始。至于初始化问题,本题中dp[i][0] dp[0][j]并没有什么意义默认为0即可
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int res = 0;
// 遍历从1开始
int[][] dp = new int[nums1.length + 1][nums2.length + 1];
for (int i = 1;i < nums1.length + 1; i++){
for (int j = 1; j < nums2.length + 1 ; j++) {
// nums下标从0开始
if (nums1[i - 1] == nums2 [j - 1 ]){
dp[i][j] = dp[i -1][j-1] + 1;
}
res = Math.max(res,dp[i][j]);
}
}
return res;
}
}