给出一个字符串说“4 2 5 5 5 1 5 5 5 29 8”,我想写一个返回第一个重复最长数字序列的函数。在这种情况下,它将返回555.这是最好和最有效的方法是什么?
这不是作业,这是我遇到的编程挑战之一
更新 我最初的方法是使用将此转换为字符数组,遍历数组,并使用indexOf查看此字符数组中是否有另一个数字说5,如果有,那么我检查下一个索引5如果它是一样的..我希望这是有道理的......但这不适用于上面的例子
答案 0 :(得分:2)
请查看后缀树http://en.wikipedia.org/wiki/Longest_repeated_substring_problem。 人们可以使用Ukkonen在线算法在O(n)时间内构建树[据我所知]。 因此,在构建树时,您可以标记最长的重复子字符串。
后缀树今天非常有用。 :) 希望我的anwser会帮助你。
干杯, 拉法
答案 1 :(得分:1)
但是我找到了类似这些问题的东西,
最长的后续序列
http://en.wikipedia.org/wiki/Longest_increasing_subsequence
和
最长的减少子序列
您的问题似乎属于此类别。检查上面的链接有一个伪代码来解决这类数学问题。
排列图中最大的集团由 最长的减少子序列 定义图形的排列; 最长的减少子序列是 相当于计算 复杂性,否定所有人 数字,增长最长 子。因此,最长 增加子序列算法可以 用于解决集团问题 在排列图中有效。
对某些内容进行编码,比您更新我们...希望您能指出它!
祝你好运!
答案 2 :(得分:0)
这似乎是一个非常奇怪的问题,因为那是微不足道的。以下代码片段返回它找到的第一个序列的起始点,如果没有,则返回-1。由于我们不关心最长的序列,我们基本上只需要搜索2个连续的值:
for (int i = 0; i < arr.length - 1; i++)
if (arr[i] == arr[i+1]) return i;
return -1
那是O(N)并且如果没有一些预先计算,你不能为任意数组做得更好。但我假设你忘记了问题的某些部分?
答案 3 :(得分:0)
使用动态编程可以在二次时间内解决(一种天真的方法是O(n³))。
def s(t):
n = len(t)
ss = [[0 for i in range(n+1)] for j in range(n+1)]
maximum = 0
max_end = 0
for i in range(n):
for j in range(i+1, n):
ss[i+1][j+1] = ss[i][j] + 1 if t[i] == t[j] else 0
tmp = max(ss[i+1])
if tmp > maximum:
max_end, maximum = i+1, tmp
return t[max_end-maximum:max_end]
以你的例子为例:
>>> s("4 2 5 5 5 1 5 5 5 29 8".split(" "))
['5', '5', '5']
虽然根据上下文,后缀树可能更快(可能最多为O(n∙log n))。
答案 4 :(得分:0)
我假设你想要第一个最长的序列(即最长的序列,如果有几个,那么第一个)。
这可以在一次通过中完成(因此O(n)):
在类似java的伪代码中(在整数上):
int[] firstLongest(int[] list) {
if (list.length <= 1) return list;
int maxLen = 1; // length of the max sequence
int maxEnd = 0; // last item for the max sequence
int curLen = 1; // length of the current sequence
for (int i = 1; i < aList.length; i++) {
if (list[i] == list[i-1]) {
curLen++;
}
else {
curLen = 1;
}
if (curLen > maxLen) {maxLen = curLen; maxEnd = i;}
}
return list.subList(maxEnd-maxLen+1, maxEnd+1);
}