我们可以想到暴力解法,即枚举数组 A 的起始位置 i 与数组 B 中的起始位置 j,然后计算A[i: ] 和 B[j: ]的最长公共前缀 k。保存 k 的最大值即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution{ publicintfindLength(int[] A, int[] B){ int m = A.length, n = B.length; int ans = 0; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ int k = 0; while(k + i < m && k + j < n && A[i + k] == B[j + k]){ k++; } ans = Math.max(k, ans); } } return ans; } }
classSolution{ publicintfindLength(int[] A, int[] B){ int m = A.length, n = B.length; int ans = 0; //B 不变 for(int i = 0; i < m; i++){ //计算剩下元素的最大长度 int len = Math.min(n, m - i); ans = Math.max(maxLength(A, B, i, 0, len), ans); } //A 不变 for(int i = 0; i < n; i++){ int len = Math.min(m, n - i); ans = Math.max(maxLength(A, B, 0, i, len), ans); } return ans; } //从对齐位置开始比较 publicintmaxLength(int[] A, int[] B, int addA, int addB, int len){ int ans = 0, k = 0; for(int i = 0; i < len; i++){ if(A[addA + i] == B[addB + i]){ ++k; }else{ k = 0; } ans = Math.max(ans, k); } return ans; } }