ClearAll[BurrowWheeler, InverseBurrowWheeler] BurrowWheeler[sin_String, {bdelim_, edelim_}] := Module[{s}, s = Characters[bdelim <> sin <> edelim]; s = RotateLeft[s, #] & /@ Range[Length[s]]; StringJoin[LexicographicSort[s][[All, -1]]] ] InverseBurrowWheeler[sin_String, {bdelim_, edelim_}] := Module[{s, chars}, chars = Characters[sin]; s = ConstantArray[{}, Length[chars]]; Do[ s = LexicographicSort[MapThread[Prepend, {s, chars}]]; , {Length[chars]} ]; StringTake[StringJoin[SelectFirst[s, Last /* EqualTo[edelim]]], {2, -2}] ] BurrowWheeler["BANANA", {"^", "|"}] InverseBurrowWheeler[%, {"^", "|"}] BurrowWheeler["appellee", {"^", "|"}] InverseBurrowWheeler[%, {"^", "|"}] BurrowWheeler["dogwood", {"^", "|"}] InverseBurrowWheeler[%, {"^", "|"}]