题意:
        给定两个整数数组,求两个数组的最长的公共子数组的长度。

方法一:
动态规划

思路:
        dp[i][j]表示数组A以A[i]结尾,数组B以B[j]结尾公共子数组的长度。
        状态转移方程:
            
if(A[i-1]==B[j-1]){//如果相等,则+1
    dp[i][j]=dp[i-1][j-1]+1;
}else{//否则,置为0
    dp[i][j]=0;
}



class Solution {
public:
    int dp[1005][1005]={0};//dp[i][j]表示数组A以A[i]结尾,数组B以B[j]结尾公共子数组的长度
    int longestCommonSubarry(vector<int>& A, vector<int>& B) {
        int n=A.size(),m=B.size();
        int res=0;
        for(int i=1;i<=n;i++){//二重循环
            for(int j=1;j<=m;j++){
                if(A[i-1]==B[j-1]){//如果相等,则+1
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{//否则,置为0
                    dp[i][j]=0; 
                }
                res=max(res,dp[i][j]);//维护最大值
            }
        }
        return res;
    }
};


时间复杂度:
空间复杂度:

方法二:
java实现

思路:
        思路同方法一相同,根据状态转移方程实现。


import java.util.*;


public class Solution {
    int[][] dp=new int[1005][1005];//dp[i][j]表示数组A以A[i]结尾,数组B以B[j]结尾公共子数组的长度
    public int longestCommonSubarry (int[] A, int[] B) {
        int n=A.length,m=B.length;
        int res=0;
        for(int i=1;i<=n;i++){//二重循环
            for(int j=1;j<=m;j++){
                if(A[i-1]==B[j-1]){//如果相等,则+1
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{//否则,置为0
                    dp[i][j]=0; 
                }
                res=Math.max(res,dp[i][j]);//维护最大值
            }
        }
        return res;
    }
}

时间复杂度:
空间复杂度: