给出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
答案 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
。
我们可以执行自下而上的动态编程,以根据这种重复出现找到答案。我们的循环不变式是,对于任何较大的dp
,i
,答案已经正确计算并存储在j
中。
希望这会有所帮助。祝你好运。
答案 1 :(得分:0)
我相信,这个问题等同于找到最长的重复子字符串https://en.wikipedia.org/wiki/Longest_repeated_substring_problem。如果允许重叠的子字符串,则可以使用线性时间中的后缀树来有效解决此问题。但是,在这种情况下,似乎需要标识不重叠的子字符串,并且这种方法不起作用。至少可以使用动态编程https://www.geeksforgeeks.org/longest-repeating-and-non-overlapping-substring/在二次时间内解决该问题。