718. 最长重复子数组(逐句解释代码)

    技术2022-07-11  84

    package LeetCode.FiveHundredOneToOneThousand; public class SevenHundredAndEighteen { public int findLength(int[] a, int[] b) { // // 暴力法 // int ans = Integer.MIN_VALUE; // for (int i = 0; i < a.length; i++){ // for (int j = 0; j < b.length; j++){ // // 寻找最长的 // int count = 0; // while (a[i+count] == b[j+count]) count++; // ans = Math.max(count,ans); // } // } // return ans; // dp int len = b.length, high = a.length; int ans = Integer.MIN_VALUE; // 防止越界 int dp[][] = new int[high + 1][len + 1]; // 进行遍历,必须两个数相等,然后将相等的长度存入dp中 // 这里我使用的是从后往前,所以我们在统计的时候,将前一个的数要读出来,相等再相加,不相等直接清零 for (int i = high - 1; i >= 0; i--){ for (int j = len - 1; j >= 0; j--){ dp[i][j] = a[i] == b[j] ? dp[i + 1][j + 1] + 1 : 0; ans = Math.max(dp[i][j], ans); } } return ans; } // 时间复杂度为O(len × high)空间复杂度为O(len × high) }
    Processed: 0.012, SQL: 9