[题记-DP]最长的重复子数组——LeetCode

    技术2022-07-11  79

    给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

    输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出:3 解释: 长度最长的公共子数组是 [3, 2, 1] 。 提示: 1 <= len(A), len(B) <= 1000 0 <= A[i], B[i] < 100

    思路:动态规划 设dp[i][j] 为以i为结尾的A数组和以j为结尾的B数组的最大重复子数组的长度。 有两种情况:

    A[i] == B[j],那么dp[i][j] = dp[j - 1][j - 1] + 1A[i] != B[i],那么dp[i][j] = 0 //c++ class Solution { public: int findLength(vector<int>& A, vector<int>& B) { int lenA = A.size(); int lenB = B.size(); if( lenA == 0|| lenB == 0 ) return {}; int dp[lenA + 1][lenB + 1]; memset(dp, 0, sizeof(dp)); int ans = 0; for( int i = 0; i < lenA; i++ ) { for( int j = 0; j < lenB; j++ ) { if( A[i] == B[j] ) { dp[i + 1][j + 1] = dp[i][j] + 1; //i + 1,j + 1是为了防止数组只有一个元素的情况 } else dp[i + 1][j + 1] = 0; ans = max(ans, dp[i + 1][j + 1]); } } return ans; } }; //java class Solution { public int findLength(int[] A, int[] B) { int lenA = A.length; int lenB = B.length; if( lenA == 0|| lenB == 0 ) return 0; int [][]dp = new int[lenA + 1][lenB + 1]; int ans = 0; for( int i = 0; i < lenA; i++ ) { for( int j = 0; j < lenB; j++ ) { if( A[i] == B[j] ) { dp[i + 1][j + 1] = dp[i][j] + 1; } else dp[i + 1][j + 1] = 0; ans = Math.max(ans, dp[i + 1][j + 1]); } } return ans; } }
    Processed: 0.009, SQL: 9