“按字典顺序排列最小的字符串旋转”与“查找字典最小字母后缀”相同吗?

时间:2014-03-25 21:59:33

标签: string algorithm data-structures

许多人可能知道Lexicographically minimal string rotation的问题。解决方案如下:How to find the number of the lexicographically minimal string rotation?


但我不是要求重复的解决方案。相反,我想问另一个相关的问题:是否与finding the lexicographical min suffix 的问题相同?

例如,我们有字符串bbaaccaadd

按字典顺序排列的字符串旋转将是“aaccaaddbb”。

要找到它,我是否可以找到bbaaccaadd的最小后缀,即aaccaadd并在末尾添加头部2“bb”?


这两个问题是否相同?

2 个答案:

答案 0 :(得分:1)

  

为了找到它,我可以找到bbaaccaadd的最小后缀,它是aaccaadd并附加头部2" bb"最后?

这并不总能产生正确的最小旋转。例如,取S = baa。然后,最小后缀为a,但最小轮换为aab,而不是ab

但是,我们可以证明

min_rotation(S) = min_suffix(S + S + '∞') 

其中'∞'是一个大于S中每个字符的字符。

  

这两个问题是否相同?

显然不完全,但它们密切相关。正如我们所看到的,我们可以使用min-suffix来直接减少来解决最小旋转。我还没有看到反向减少,但也许有类似的减少。正如David指出的那样,如果我们将负无穷大附加到字符串S,那么字符串的第二个最小旋转对应于其最小后缀。此外,用于最小轮换的Booth's算法可以easily be adapted来解决min-suffix。

答案 1 :(得分:0)

问题是否“相同”的问题没有明确定义,因此我在此假设它是指最优时间复杂度方面的解决方案等价。

为了证明这一点,它足以显示我们如何将min-rotation减少到min-suffix,反之亦然,其中减少开销是O(n)时间(其中n是字符串长度)。

min-rotation to min-suffix

通过在最小旋转输入上附加无限值的字符来进行缩减,正如Niklas B所描述的那样。

min-rotation到min-rotation

请注意以下观察:min-suffix必须以输入字符串中的最小子字符串M开头。最小旋转解决方案也必须以M开头,否则可以改进。因此,如果我们有S'= min-rotation(S),则S'的最短前缀(也是S的后缀)是S的最小后缀。

现在我们只需处理以下问题:给定两个字符串S1和S2,找到S1的最短前缀,它也是S2的后缀。通过创建S2的后缀树T,然后遍历S1直到在T中找到匹配,可以在线性时间内解决此问题。