1. 最长重复数组
(1)暴力
跟最长公共子串一个解法,没有变化
class Solution {
public int findLength(int[] nums1, int[] nums2) {
if (nums1 == null || nums2 == null) {
return 0;
}
int l1 = nums1.length;
int l2 = nums2.length;
int res = 0;
for (int i = 0; i < l1; i++) {
for (int j = 0; j < l2; j++) {
int m = i;
int n = j;
int len = 0;
while (m < l1 && n < l2 && nums1[m] == nums2[n]) {
len++;
m++;
n++;
}
res = Math.max(res, len);
}
}
return res;
}
}
(2)DP
用一个二维数组dp[i][j]表示 第一个字符串前 i 个字符(0,i - 1) 和 第二个字符串前 j 个字符(0,j - 1) 组成的最长公共字符串的长度。
那么我们在计算dp[i][j]的时候,我们首先要判断s1.charAt(i)是否等于s2.charAt(j):
- 如果不相等,说明当前字符无法构成公共子串,所以dp[i][j]=0。
- 如果相等,说明可以构成公共子串,我们还要加上他们前一个字符构成的最长公共子串长度,也就是dp[i-1][j-1]。所以我们很容易找到递推公式
class Solution {
public int findLength(int[] nums1, int[] nums2) {
if (nums1 == null || nums2 == null || nums1.length == 0 || nums2.length == 0)
return 0;
int max = 0;
// +1是为了防止边界条件判断 和 减少初始化当 i 或 j 等于 0 时,初始化子串就是为0,初始化数组也是为0
int[][] dp = new int[nums1.length + 1][nums2.length + 1];
for (int i = 1; i <= nums1.length; i++) {