Lexicographical minimum in a String
Problem: Given a string, find the lexicographical minimum string keeping the order of alphabets same as the original string.
For example:
| Given String | Lexicographical Minimum |
|---|---|
| DABC | ABCD |
| ABCD | ABCD |
| CABABC | ABABCC |
| ABABCABA | ABAABABC |
Solution: This can be done in O(n) by the following code, 学会操作字符串:

static String lexMin(String str)
{
String str2 = str + str;
int offset = 0;
int answer = 0;
for (int i = 1; i < str2.length(); i++)
{
if (str2.charAt(i) < str2.charAt(answer))
{
// New lexicographical minimum found.
// Reset all parameters here.
answer = i;
offset = 0;
}
else if (str2.charAt(i) == str2.charAt(answer + offset))
{
// Keep moving the offset till this new string matches the previous answer
offset++;
}
else if (str2.charAt(i) < str2.charAt(answer + offset))
{
// In the new match, some character is found which is lower
// than the character at same offset in the previous answer.
// So new answer becomes the lexicographical minimum, discard
// the previous answer in favor of the new answer.
answer = i - offset;
offset = 0;
i = answer;
}
else
{
// In the new match, some character is found which is higher
// than the character at same offset in the previous answer.
// So new answer cannot be the lexicographical minimum, discard it.
offset = 0;
}

浙公网安备 33010602011771号