The following is an O(nlgn) solution, I hope that helps
// start is initially 0, end = aabb.length-1
public static char[] changeOrderOfString(char[] aabb, int start, int
end)
{
if (end - start <= 1)
return aabb;
if ((end - start + 1) % 4 != 0)
{
for (int i = start + 1, j = end - 1; j > i; j--, i++)
{
char temp = aabb[i];
aabb[i] = aabb[j];
aabb[j] = temp;
}
return changeOrderOfString(aabb, start + 1, end - 1);
}
else
{
int mid = (start + end) / 2;
int frondMid = (start + mid) / 2 + 1, backMid = (mid + end)
/ 2;
for (int i = 0; frondMid + i <= mid; i++)
{
char temp = aabb[frondMid + i];
aabb[frondMid + i] = aabb[mid + 1 + i];
aabb[mid + 1 + i] = temp;
}
aabb = changeOrderOfString(aabb, start, mid);
aabb = changeOrderOfString(aabb, mid + 1, end);
return aabb;
}
}