给定长度为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)时间内实现吗?
答案 0 :(得分:1)
您正在寻找s的longest common substring及其反面。这确实可以使用广义后缀数组或s和reverse(s)的后缀树在线性时间内解决。
虽然使用suffix automaton的概念上更简单的方法。后缀自动机是一个有限自动机,它与字符串的后缀完全匹配,并且可以在线性时间内构建。您可以在C ++ in my Github repository中找到实现。现在你只需将第二个字符串(在本例中为reverse(s))输入自动机并记录最长匹配,这对应于两个字符串的LCS。