题目
//给两个整数数组 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
//
// Related Topics 数组 哈希表 二分查找 动态规划
思路
首先确认
dp二维数组表达意思为 i长度的j长度最大匹配子数组长度
则根据例题
A: [1,2,3,2,1]
B: [3,2,1,4,7]
第一步 找到所有A[i] == B[j]
1 | 2 | 3 | 2 | 1 | |
---|---|---|---|---|---|
3 | 1 | ||||
2 | 1 | ||||
1 | 1 | ||||
4 | |||||
7 |
第二步 因为是个字符匹配所以根据如图找到的标记为1的地方可以得知如果需要判断最大长度则取d[i-1][j-1]+1则可得到最大长度,得图
1 | 2 | 3 | 2 | 1 | |
---|---|---|---|---|---|
3 | 1 | ||||
2 | 2 | ||||
1 | 3 | ||||
4 | |||||
7 |
第三步 判断临界值,如果A或者B数组为空呢?则将dp数组都扩大一个元素存储空的情况
空 | 1 | 2 | 3 | 2 | 1 | |
---|---|---|---|---|---|---|
空 | ||||||
3 | 1 | |||||
2 | 2 | |||||
1 | 3 | |||||
4 | ||||||
7 |
答案
public int findLength(int[] A, int[] B) {
int res = 0;
int[][] dp = new int[A.length+1][B.length+1];
for(int i = 1;i<A.length+1;i++){
for(int j = 1;j<B.length+1;j++){
if(A[i-1] == B[j-1] ){
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = 0;
}
res = Math.max(res,dp[i][j]);
}
}
return res;
}