718. 最长重复子数组

718. 最长重复子数组

原题链接:

718. 最长重复子数组

https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/

完成情况:

题解:

方法一:动态规划

java 复制代码
package 西湖算法题解___中等题;

public class __718最长重复子数组__动态规划 {
	//子数组的话,默认是连续的。
	public int findLength(int[] nums1, int[] nums2) {
		/*
		给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。
		当然了,肯定是要求顺序,而非连续。
		那么必然就需要用到动态数组,采取累积的形式

		 */
		int n = nums1.length,m = nums2.length;
		int dp_findLength [][] = new int[n+1][m+1];
		int res = 0;
		for (int i=n-1;i>=0;i--){
			for (int j=m-1;j>=0;j--){
				dp_findLength[i][j] = (nums1[i] == nums2[j] ? dp_findLength[i+1][j+1] + 1:0);
				res = Math.max(res,dp_findLength[i][j]);
			}
		}
		return res;
	}
}

方法二:滑动窗口


java 复制代码
package 西湖算法题解___中等题;

public class __718最长重复子数组__滑动窗口 {
	public int findLength(int[] nums1, int[] nums2) {
		int n = nums1.length,m = nums2.length;
		int res = 0;
		for (int i=0;i<n;i++){
			int len = Math.min(m,n-i);
			int maxLen = maxLength(nums1,nums2,i,0,len);
			res = Math.max(res,maxLen);
		}
		for (int i=0;i<m;i++){
			int len = Math.min(n,m-i);
			int maxLen = maxLength(nums1,nums2,0,i,len);
			res = Math.max(res,maxLen);
		}
		return res;
	}

	private int maxLength(int[] nums1, int[] nums2, int addA, int addB, int len) {
		int res = 0,k=0;
		for (int i=0;i<len;i++){
			if (nums1[addA+i] == nums2[addB+i]){
				k++;
			}else {
				k=0;
			}
			res = Math.max(res,k);
		}
		return res;
	}
}

方法三:二分查找 + 哈希

java 复制代码
package 西湖算法题解___中等题;

import java.util.HashSet;
import java.util.Set;

public class __718最长重复子数组__二分查找_哈希表 {
	int mod = 1000000009;
	int base = 113;
	public int findLength(int[] nums1, int[] nums2) {
		int left = 1,right = Math.min(nums1.length,nums2.length)+1;
		while (left < right){
			int mid = (left + right) >> 1;
			if (myCheck(nums1,nums2,mid)){
				left = mid +1;
			}else {
				right = mid;
			}
		}
		return left - 1;
	}

	private boolean myCheck(int[] A, int[] B, int len) {
		long hashA = 0;
		for (int i=0;i<len;i++){
			hashA = (hashA * base + A[i]) % mod;
		}
		Set<Long> bucketA = new HashSet<Long>();
		bucketA.add(hashA);
		long mult = qPow(base,len - 1);
		for (int i = len;i < A.length;i++){
			hashA = ((hashA - A[i - len] * mult % mod + mod) % mod * base + A[i]) % mod;
			bucketA.add(hashA);
		}
		long hashB = 0;
		for (int i=0;i<len;i++){
			hashB = (hashB * base +B[i])%mod;
		}
		if (bucketA.contains(hashB)){
			return true;
		}
		for (int i=len;i<B.length;i++){
			hashB = ((hashB - B[i - len] * mult % mod + mod) % mod * base + B[i]) % mod;
			if (bucketA.contains(hashB)){
				return true;
			}
		}
		return false;
	}

	/**
	 * 使用快速幂计算x^n % mod 的值
	 * @param x
	 * @param n
	 * @return
	 */
	private long qPow(long x, long n) {
		long res = 1L;
		while (n != 0){
			if ((n&1) != 0){
				res = res * x % mod;
			}
			x = x*x % mod;
			n >>= 1;
		}
		return res;
	}
}
相关推荐
卡尔特斯4 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源4 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole4 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫4 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide5 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261355 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源5 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
CoovallyAIHub6 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
Java中文社群6 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心6 小时前
从零开始学Flink:数据源
java·大数据·后端·flink