718最长重复子数组- 动态规划

    技术2022-07-11  126

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

    示例 1: 输入: 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

    方法一 动态规划 主要思路: (1)使用二维的动态数组,dp[ i ] [ j ]表示第一个数组的第 i 个元素和第二个数组的第 j 个元素进行比较,若A[ i]==B[ j ],则表示此时的这两个元素处在重复的子数组之中,则 dp[ i ][ j ]=dp[ i-1 ][ j-1 ]+1,否则既为0; (2)使用一个中间变量保存这个比较过程中最大的dp[ i ][ j ];

    class Solution { public: int findLength(vector<int>& A, vector<int>& B) { //处理特殊情形 if(A.empty()||B.empty()) return 0; int rows=A.size(); int cols=B.size(); vector<vector<int>> dp(rows,vector<int>(cols,0)); int res=0; //处理第一列的初始值,既使用B的第零个元素和A的所有元素比较 for(int i=0;i<rows;++i){ if(B[0]==A[i]){ dp[i][0]=1; res=1; } } //处理第一行的初始值,既使用A的第零个元素和B的所有元素比较 for(int i=1;i<cols;++i){ if(A[0]==B[i]){ dp[0][i]=1; res=1; } } //比较A的第i个元素和B的第j 个元素 for(int i=1;i<rows;++i){ for(int j=1;j<cols;++j){ if(A[i]==B[j]){ dp[i][j]=dp[i-1][j-1]+1; res=max(res,dp[i][j]);//保留当前的最长的重复子数组的长度 } } } return res; } };
    Processed: 0.019, SQL: 9