0

Consider a string of length n (1 <= n <= 100000). Determine its minimum lexicographic rotation. For example, the rotations of the string “alabala” are:

alabala

labalaa

abalaal

balaala

alaalab

laalaba

aalabal

and the smallest among them is “aalabal”.

This question has already been asked on Stack but I'm re asking it as no clear solution is available. Till now I made following progress.
1. Take S, concat with reverse(S)..let P=S+reverse(S)
2.construct suffix array of above string P

Now my question is if I pick first string in suffix array of size> strlen(S) then prefix of size strlen(S) of this string will be minimum rotation of given string S.

Is my conclusion correct?

username_4567
  • 4,737
  • 12
  • 56
  • 92

1 Answers1

0

No, in general it is wrong (if I understand correctly what you mean). Of course it works ok for your palindromic input.

See the following output from python interpreter, where input strings include 'alabala' and 'alabatta'. (Output has had some spaces and linewraps added.) In the second section, the front part of the first suffix longer than S is inadmissable, ie is not a rotation of S. See third section for an approach that works.

>>> 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']
James Waldby - jwpat7
  • 8,593
  • 2
  • 22
  • 37