给定一个字符串S,由小写拉丁字母组成。我想找到每个位置S [i] max length L [i],其中存在位置i'<我认为s [i'... i'+ L [i] -1] = s [i..i + L [i] -1]。例如:s = ababaab,L = {0,0,3,2,1,2,1}。我想做时间< O(| S | ^ 2)。我猜这个问题是用后缀数组解决的但是怎么样?
答案 0 :(得分:0)
你应该看一下ZBlock算法,虽然这个算法解决了一个稍微不同的问题(其中i'总是等于0),它运行在O(| S |)中。您应该可以在方便时修改它。
动态编程可以使用子串匹配的修改版本在O(| S | ^ 2)中解决这个问题,但我想你不是在寻找这样的解决方案。
答案 1 :(得分:0)
你正在寻找的是“最长的先前因素”,Crochemore和Ilie确实有一篇论文用两个后缀数组算法来计算它。好消息是两者都是线性时间。第二种算法使用Lcp表,看起来更容易一些。