題目描述
給兩個整數數組 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]表示A數組必須以第i個數字結尾,B數組必須以第j個數字結尾的前提下,最長公共子數組的長度。
- 當i=0時,如果A[i]=B[j],dp[i][j]=1;否則的話dp[i][j]=0
- 當j=0時,如果A[i]=B[j],dp[i][j]=1;否則的話dp[i][j]=0
- 當i≠0且j≠0時,如果A[i]=B[j],dp[i][j]=1+dp[i-1][j-1];否則的話dp[i][j]=0
通過上述分析可得時間複雜度爲O(MN)空間複雜度也是,可以將空間複雜度優化到O(1),因爲dp[i][j]的取值只依賴於上一行,上一列對應的值,所以我們從右上角開始計算
元素的取值僅和處於同一條對角線上的元素有關。
public int findLength2(int[] A, int[] B) {
if(A==null||B==null)
return 0;
int max=0;
int len=0;
int row=0;
int col=A.length-1;
while(row<B.length) {
int i=row,j=col;
len=0;
while(i<B.length&&j<A.length) {
if(B[i]==A[j])
len++;
else
len=0;
max=Math.max(len, max);
i++;j++;
}
if(col>0)
col--;
else
row++;
}
return max;
}