子序列默认不连续,子数组默认连续!!!
连续与不连续处理起来差别很大
一、最长重复子序列(哈希表)
用HashMap集合记录两个数组每个数字和其对应出现的次数,再用set集合去重,将set集合转换成数组并遍历,如果两个HashMap集合中都有对应的key值,那么res加上两者中较小的那个
public int eldestSonSequence(int[] nums1, int[] nums2) {
Map<Integer, Integer> map1 = new HashMap<>();
for (int num : nums1) {
if (!map1.containsKey(num)) {
map1.put(num, 1);
} else {
map1.put(num, map1.get(num) + 1);
}
}
Map<Integer, Integer> map2 = new HashMap<>();
for (int num : nums2) {
if (!map2.containsKey(num)) {
map2.put(num, 1);
} else {
map2.put(num, map2.get(num) + 1);
}
}
Set<Integer> set = new HashSet<>();
for (int num : nums1) {
set.add(num);
}
int[] arr = set.stream().mapToInt(Integer::valueOf).toArray();;
int res = 0;
for (int i = 0; i < arr.length; i++) {
int num = arr[i];
if (map1.containsKey(num) && map2.containsKey(num)) {
res += Math.min(map1.get(num), map2.get(num));
}
}
return res;
}
二、最长重复子数组 (Dynamic Programming)
public int findLength(int[] nums1, int[] nums2) {
int m = nums1.length, n = nums2.length;
int[][] dp = new int[m + 1][n + 1];
int ans = 0;
for(int i = 1; i < m + 1; i++) {
for(int j = 1; j < n + 1; j++) {
dp[i][j] = nums1[i - 1] == nums2[j - 1] ? dp[i - 1][j - 1] + 1 : 0;
ans = Math.max(ans, dp[i][j]);
}
}
return ans;
}