最长重复子数组

题目链接

最长重复子数组

题目描述

最长重复子数组

注意点

  • 子数组是连续的

解答思路

  • 采用动态规划查找最长重复子数组的长度

代码

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中找到最大值
上一篇:合并两个有序数组


下一篇:LeetCode之寻找两个正序数组的中位数(四)