检测阵列中的第一个序列

时间:2011-06-19 00:50:28

标签: java

给出一个字符串说“4 2 5 5 5 1 5 5 5 29 8”,我想写一个返回第一个重复最长数字序列的函数。在这种情况下,它将返回555.这是最好和最有效的方法是什么?

这不是作业,这是我遇到的编程挑战之一

更新 我最初的方法是使用将此转换为字符数组,遍历数组,并使用indexOf查看此字符数组中是否有另一个数字说5,如果有,那么我检查下一个索引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);
}