考虑长度为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的最小旋转。
我的结论是否正确?
答案 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']