许多人可能知道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”?
这两个问题是否相同?
答案 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中找到匹配,可以在线性时间内解决此问题。