package LeetCode.FiveHundredOneToOneThousand;
public class SevenHundredAndEighteen {
public int findLength(int[] a, int[] b) {
// // 暴力法
// int ans = Integer.MIN_VALUE;
// for (int i = 0; i < a.length; i++){
// for (int j = 0; j < b.length; j++){
// // 寻找最长的
// int count = 0;
// while (a[i+count] == b[j+count]) count++;
// ans = Math.max(count,ans);
// }
// }
// return ans;
// dp
int len = b.length, high = a.length;
int ans = Integer.MIN_VALUE;
// 防止越界
int dp[][] = new int[high + 1][len + 1];
// 进行遍历,必须两个数相等,然后将相等的长度存入dp中
// 这里我使用的是从后往前,所以我们在统计的时候,将前一个的数要读出来,相等再相加,不相等直接清零
for (int i = high - 1; i >= 0; i--){
for (int j = len - 1; j >= 0; j--){
dp[i][j] = a[i] == b[j] ? dp[i + 1][j + 1] + 1 : 0;
ans = Math.max(dp[i][j], ans);
}
}
return ans;
}
// 时间复杂度为O(len × high)空间复杂度为O(len × high)
}