Consider a string of length n (1 <= n <= 100000).
Determine its minimum lexicographic rotation.
For example, the rotations of the string “alabala
Thanks all .Both the answer by vkorchagin and usamec is correct for most Test Cases ,but they won't work for the Following Test Case(S="baabaa")
S=baabaa; S'=baabaabaabaa;
Suffix| Suffix | Suffixes
Index | Length |
11 1 a
10 2 aa
7 5 aabaa
4 8 aabaabaa
1 11 aabaabaabaa
8 4 abaa
5 7 abaabaa
2 10 abaabaabaa
9 3 baa
6 6 baabaa
3 9 baabaabaa
0 12 baabaabaabaa
Taking the First Suffix whose Index is between 0 to S.length()-1 does not work for the above test case.If I does so ,then the result is 4 ,but the correct answer is 1.
So I modified the answer ,a bit .
This is what i did or added/modified an extra condition to the above answers ::
(1)I took the First Suffix whose Index is between 0 to S.length()-1 .
Lets say its index is :=ExpectedIdx.
In the above Example ExpectedIdx=4.
(2).Now the ExpectedIdx may or may not be the answer. The reason is the Next suffix in Suffix Array may produce the same answer.
Example ::
Taking the suffix whose starting Index is 4 (ExpectedIdx),aabaabaa.,we get aabaab as Minimum Lexograhic rotated String.
Taking the Next suffix , aabaabaabaa.
We also get aabaab as Minimum Lexograhic rotated String.
But the former one requires the shift of 4 while the latter one requires the shift of 1 .So correct answer is 1 ,not 4.
So i used the concept of Longest Common Prefix (LCP) to check the similarities and Finally got accepted.http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=756
Edit:: This is the Pseudocode -
int ExpectedIdx,ExpectedSuffixNumber,ExpectedSuffixLength;
for(int i=0;i(Len/2))//Len/2:=Size of S
{
ExpectedIdx=SA[i];
ExpectedSuffixNumber=i;
ExpectedSuffixLength=suffixsize;
break;
}
}
//Now this ExpectediDx may or may not be the correct answer.
int finalans=ExpectedIdx;//Lets assume initially that ExpectedIdx is a correct/final answer.
for(int i=(ExpectedSuffixNumber+1);iLen/2)//LCP[i]=Lingest common prefix of adjacent prefixes in a suffix Array.
{
if(SA[i]>finalans)
{
finalans=SA[i];
}
}
else
break;
}