As I continue working my way through the book on programming puzzles, I came across those involving permutations. In this post I’ll collect puzzles with the same theme, both from the book and from the internet.
All permutations
The first puzzle is to compute all the permutations of a given array. By extension, it can be used to compute all the permutations of a string, too, if we view it as an array of characters. To do this we’ll implement Heap’s algorithm. The following is its recursive version.
1 | def heap(permutations: list[list], A: list, n: int): |
The array permutations
is the accumulator which will store all the permutations of the array. The initial arguments to the function would be an empty acuumulator, the list to permute, and the length of the list.
Next permutation
The next puzzle we’ll look at is computing the next permutation of the array in lexicographical order. The following implementation has been taken from the book.
1 | def next_permutation(perm: list[int]) -> list[int]: |
Previous permutation
A variation of the puzzle is to compute the previous permutation of the array in lexicographical order. The idea is to “reverse” the logic for computing the next permutation. If we look closely, we’ll find that all we’re changing are the comparison operators.
1 | def previous_permutation(perm: list[int]) -> list[int]: |
kth smallest permutation
The final puzzle we’ll look at is the one where we need to compute the k’th smallest permutation. The solution to this uses the previous_permutation
function that we saw above. The idea is to call this function k times on the lexicographically-largest array. Sorting the array in decreasing order results is the largest. This becomes the input to the previous_permutation
function.
1 | def kth_smallest_permutation(perm: list[int], k: int) -> list[int]: |
That’s it. These are puzzles involving permutations.