使用后缀数组进行最小旋转 - 重新访问

时间:2012-11-03 05:48:52

标签: string algorithm suffix-array

考虑长度为n的字符串(1 <= n <= 100000)。     确定其最小字典旋转。     例如,字符串“alabala”的旋转是:

alabala

labalaa

abalaal

balaala

alaalab

laalaba

aalabal

and the smallest among them is “aalabal”.

这个问题已经在Stack上被问到了,但是我一直在问它,因为没有明确的解决方案。直到现在我取得了以下进展 1.取S,反转(S)连续..让P = S +反转(S)
2.构造上面的字符串P

的后缀数组

现在我的问题是,如果我在size> strlen(S)的后缀数组中选择第一个字符串,那么此字符串的大小strlen(S)的前缀将是给定字符串S的最小旋转。

我的结论是否正确?

1 个答案:

答案 0 :(得分:0)

不,一般来说这是错误的(如果我理解你的意思)。当然,它适用于你的回文输入。

请参阅python interpreter的以下输出,其中输入字符串包括'alabala''alabatta'。 (输出已经添加了一些空格和换行。)在第二部分中,第一个后缀长于S的前部是不允许的,即不是S的旋转。有关可行的方法,请参阅第三部分。

>>> s = 'alabala'; p = s + ''.join(reversed(s))
>>> sorted([p[i:] for i in range(len(p))])
['a', 'aalabala', 'abala', 'abalaalabala', 'ala', 'alaalabala',
 'alabala', 'alabalaalabala', 'bala', 'balaalabala', 'la',
 'laalabala', 'labala', 'labalaalabala']

>>> s = 'alabatta'; p = s + ''.join(reversed(s))
>>> sorted([p[i:] for i in range(len(p))])
['a', 'aattabala', 'abala', 'abattaattabala', 'ala', 'alabattaattabala',
 'attaattabala', 'attabala', 'bala', 'battaattabala', 'la',
 'labattaattabala', 'taattabala', 'tabala', 'ttaattabala', 'ttabala']

>>> s = 'alabatta'; p = s + s
>>> sorted([p[i:] for i in range(len(p))])
['a', 'aalabatta', 'abatta', 'abattaalabatta', 'alabatta', 
 'alabattaalabatta', 'atta', 'attaalabatta', 'batta', 'battaalabatta',
 'labatta', 'labattaalabatta', 'ta', 'taalabatta', 'tta', 'ttaalabatta']