classSolution{publicintfindLength(int[] A,int[] B){int n = A.length, m = B.length;int[][] dp =newint[n +1][m +1];int ans =0;for(int i = n -1; i >=0; i--){for(int j = m -1; j >=0; j--){dp[i][j]= A[i]== B[j]? dp[i +1][j +1]+1:0;ans = Math.max(ans, dp[i][j]);}}return ans;}}publicintfindLength(int[] A,int[] B){int lenA = A.length;int lenB = B.length;int[][] dp =newint[lenA][lenB];int max = Integer.MIN_VALUE;for(int i =0; i < lenA; i++){for(int j =0; j < lenB; j++){if(A[i]== B[j]){if(i >0&& j >0){dp[i][j]= dp[i -1][j -1]+1;}else{dp[i][j]=1;}}max = Math.max(max,dp[i][j]);}}return max;}
3. 滑動(dòng)窗口
時(shí)間復(fù)雜度:O((N+M)×min(N,M)) 空間復(fù)雜度:O(1)
classSolution{publicintfindLength(int[] A,int[] B){int n = A.length, m = B.length;int ret =0;for(int i =0; i < n; i++){int len = Math.min(m, n - i);int maxlen =maxLength(A, B, i,0, len);ret = Math.max(ret, maxlen);}for(int i =0; i < m; i++){int len = Math.min(n, m - i);int maxlen =maxLength(A, B,0, i, len);ret = Math.max(ret, maxlen);}return ret;}publicintmaxLength(int[] A,int[] B,int addA,int addB,int len){int ret =0, k =0;for(int i =0; i < len; i++){if(A[addA + i]== B[addB + i]){k++;}else{k =0;}ret = Math.max(ret, k);}return ret;}}