找到最长的重复子数组

时间:2019-12-09 21:12:03

标签: java arrays algorithm sub-array

给出a[0..N-1]之间的整数数组0 < N < 10^5,找到在最佳时间和空间内最长重复次数最多的子数组的大小。我当时在考虑使用HashMap在数字开头存储索引,并开始检查每个索引可能形成的子数组。但这似乎效率很低,所以我想听听一些有关如何解决此问题的意见。

示例:

输入a = [0,1,2,1,4,1,2,1,0,5]
预期输出:Most Repeated: [1,2,1]; Size: 3

2 个答案:

答案 0 :(得分:3)

这类问题被认为是幼稚的方法-花费大量时间并用蛮力搜索所有可能的解决方案。

很明显,您不是在寻找那个。每当您遇到这种情况时,答案始终是动态编程。它是相当广泛的,对于初学者来说很困难,并且在计算机科学中非常重要。这意味着,我无法在此答案中进行覆盖。

但这是关于如何解决此问题的一种方法。

由于A和B的公共子数组必须从A[i]B[j]开始,所以将dp[i][j]设为A[i:]B[j:]的最长公共前缀。每当A[i] == B[j]时,我们就知道dp[i][j] = dp[i+1][j+1] + 1。另外,答案是max(dp[i][j])i中的j

我们可以执行自下而上的动态编程,以根据这种重复出现找到答案。我们的循环不变式是,对于任何较大的dpi,答案已经正确计算并存储在j中。

希望这会有所帮助。祝你好运。

答案 1 :(得分:0)

我相信,这个问题等同于找到最长的重复子字符串https://en.wikipedia.org/wiki/Longest_repeated_substring_problem。如果允许重叠的子字符串,则可以使用线性时间中的后缀树来有效解决此问题。但是,在这种情况下,似乎需要标识不重叠的子字符串,并且这种方法不起作用。至少可以使用动态编程https://www.geeksforgeeks.org/longest-repeating-and-non-overlapping-substring/在二次时间内解决该问题。