给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例 1:
输入:
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
暴力解法
public int findLength(int[] A, int[] B) {
int maxLen = 0;
for (int i=0;i<A.length;++i){
for (int j=0;j<B.length;++j){
if (A[i] == B[j]){
int i1 = i+1, i2 = j+1 ,len = 1;
while (i1 < A.length && i2 < B.length){
if (A[i1] != B[i2]) break;
i1++;
i2++;
len++;
}
if (maxLen < len) maxLen = len;
}
}
}
return maxLen;
}
动态规划
public int findLength(int[] A, int[] B) {
int aLen = A.length ,bLen = B.length;
int[][] dp = new int[aLen][bLen];
for (int i=aLen-1;i>=0;i--){
for (int j=bLen-1;j>=0;j--){
if (A[i] == B[j]){
dp[i][j] = i==aLen-1 || j==bLen-1 ? 1 : dp[i+1][j+1] + 1;
}
}
}
int maxLen = 0;
for (int i=aLen-1;i>=0;i--){
for (int j=bLen-1;j>=0;j--){
if (dp[i][j] > maxLen) maxLen = dp[i][j];
}
}
return maxLen;
}
滑动法
public int findLength(int[] A, int[] B) {
int aLen = A.length ,bLen = B.length;
int maxLen = 0;
for (int j=bLen-1;j>=0;j--){
int t1 = 0 ,t2 = j ,len = 0;
while (t1 < aLen && t2 < bLen){
if (A[t1] == B[t2]){
len++;
}else{
if (len > maxLen) maxLen = len;
len = 0;
}
t1++;
t2++;
}
if (len > maxLen) maxLen = len;
}
for (int i=1;i<aLen;i++){
int t1 = i ,t2 = 0 ,len = 0;
while (t1 < aLen && t2 < bLen){
if (A[t1] == B[t2]){
len++;
}else{
if (len > maxLen) maxLen = len;
len = 0;
}
t1++;
t2++;
}
if (len > maxLen) maxLen = len;
}
return maxLen;
}