18.3 Listing all permutations of a string

Sometimes, we have a string (e.g. "MATHS"), of which we’d like to list out all the possible permutations. To list these, we have to do this systematically. A nice way to do this is using Heap’s algorithm. To generate all the permutations of a string, we first pick one letter. When we generate all the permutations of this string, we will have different strings, each of which has that letter at a different position. For example, in the case of "MATHS", we will have all the following (where \say_ means we don’t know what letter will be at that position.)

  • \say

    M____

  • \say

    _M___

  • \say

    __M__

  • \say

    ___M_

  • \say

    ____M

The key idea of Heap’s algorithm is that in each of these cases, the valid choices for the four unknown items (\say_) are any of the permutations of the four letters in question. This means that we’ve found a way to write the permutations of five letters (which we don’t know) in terms of the permutations of four letters arranged with a known letter in-between them. From here, we can apply the same algorithm many times - for the four-letter permutation we can reduce it to a three letter permutation, and so on until we have only one letter left. In this case, there is only one possible permutation.

There are too many possibilities here to list out all the permutations, but for the first one (\sayM____), the process would go something like this:

  • \say

    MA___

  • \say

    M_A__

  • \say

    M__A_

  • \say

    M___A

If we then pick the first one here (the process for the rest is the same) we have

  • \say

    MAT__

  • \say

    MA_T_

  • \say

    MA__T

proceeding with the first one again

  • \say

    MATH_

  • \say

    MAT_H

and then finally

  • \say

    MATHS

There are a lot more possibilities than that, but I’ve only listed out some of them; to obtain the full list, just continue the process.