NB: This post is a part of the series of solving the challenges from 'Cracking The Coding Interview' book with JavaScript. I'll post only the challenges I've figured out on my own - and will try to describe my reasoning behind the solution. Any ideas on how to solve it differently or in a more optimal way are very welcome 😊
Write a method to compute all permutations of a string of unique characters.
I've approached this one by taking a specific example: finding all permutations of 123
. Permutations are all the possible combinations of elements, so from 123
we need to get the following ones: 123, 132, 213, 231, 312, 321
- 6 in total. Let's say we knew all permutations of a string of 12
, could we then somehow get the permutations of 123
? Sure! See the drawing:
We know that permutations of 12
are 12
and 21
- and it looks like we just need to add 3 to every possible position for each of those arrays in order to get out result 🎉(result should be all arrays in the pink circle). The transition from 1
to 12
works in a similar way: to get all permutations of 12
we just need to put 2
in all possible indices in the string of 1
- either before 1 (21
) or after (12
).
In Javascript this logic can be reflected by the following code:
function getPermutations(str) {
const lastIndex = str.length - 1;
const lastChar = str[lastIndex];
if (lastIndex === 0) { return [str]; }
const prev = getPermutations(str.slice(0, lastIndex));
return prev.flatMap(elem => {
const result = [];
for (let i = 0; i <= lastIndex; i ++) {
const newElem = elem.slice(0, i) + lastChar + elem.slice(i);
result.push(newElem);
}
return result;
});
}
With getPermutations(str.slice(0, lastIndex))
we're calculating the permutations of a shorter string (string without the last character), and then mapping over the array of these permutations. Each element in the map is then looped over, so that we could create a set of new strings with added last character. This way, for an element 12
, we would be able to return [312
, 132
, 123
]. Finally, flatMap allows to return the result as one array - [312, 132, 123, 321, 232, 213]
instead of [[312, 132, 123], [321, 232, 213]]
- which is convenient for the next iteration of the recursion
Top comments (0)