查找非重叠的重复子字符串

时间:2017-08-31 09:31:54

标签: java arrays string repeat longest-substring

我的问题类似于以这种方式找到最长的重复非重叠子字符串。例如,我的输入数组是0,0,0,1,2,1,1,2,1,1,2,1,2,0,0

此输入中最长的重复和非重叠子字符串为121,计数为3 现在,从输入数组中删除121的出现次数,并将其替换为-1

我的输入现在变为:0,0,0,-1,-1,-1,2,0,0 现在再次找到相同的子字符串。

注意:答案中不包括-1。因此,下一个最长的非重叠且重复的子字符串为00,其计数为2

从输入中删除0,0的出现,然后变为:0,-1,-1,-1,2,-1 现在唯一出现的是0和2,长度为1.所以,我们停在这里。

我只能想到O(n 3 )的蛮力。尝试过考虑后缀树,但不知道如何在其中包含非重叠条件。

我非常天真的实施:

因为我希望我的子字符串计数为至少2,所以它的最大长度为N / 2(N是输入数组的大小)

for len = N/2 to 1:
    // find all sub-strings of length as "len" in the input sequence
    for i=0 to N-len+1
        // the sub-string is s[i... (i+len)]
        // find non-overlapping count of this sub-string in the input sequence using KMP
        int count = find_Count();
        // take the substring with maximum count, let it be "r"
    end
    modify the array to place replace non-overlapping occurrences of "r" with -1
end

如上所述,复杂性为O(N 3 )。

任何最佳解决方案,提示或解释都可以提供一些帮助。

由于

0 个答案:

没有答案