如何使用后缀树在线性时间内找到这样的字符串?

时间:2015-11-03 23:31:22

标签: algorithm search data-structures suffix-tree

给定长度为n的字符串s,找到s中向前和向后出现的最长字符串t。 例如,s = yabcxqcbaz,然后返回t = abc或t = cba

我正在考虑使用广义后缀树,但我认为这需要花费O(n ^ 2)时间。

i = 0 # Initialize the position on the S
j = 0 # Initialize the position on the Sr
n = len(S) # n is the length of the string
maxLengthPos = (0, 0) # Record the maximum length of such substring found so far and its position

# Iterate through every 
for i in range(n):
    for j in range(n):
        maxL, pos = maxLengthPos
        l = LCE(i, j) # The longest common extension which take O(1) time
        if l > maxL:
            maxLength = (l, i)

我可以在O(n)时间内实现吗?

1 个答案:

答案 0 :(得分:1)

您正在寻找s的longest common substring及其反面。这确实可以使用广义后缀数组或s和reverse(s)的后缀树在线性时间内解决。

虽然使用suffix automaton的概念上更简单的方法。后缀自动机是一个有限自动机,它与字符串的后缀完全匹配,并且可以在线性时间内构建。您可以在C ++ in my Github repository中找到实现。现在你只需将第二个字符串(在本例中为reverse(s))输入自动机并记录最长匹配,这对应于两个字符串的LCS。