最長重複子數組

題目描述

給兩個整數數組 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;
	}
發佈了124 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章