2020-10-11 19:00:38 +02:00
|
|
|
'use strict'
|
|
|
|
|
|
|
|
|
|
const permutate = (aString) => {
|
|
|
|
|
if (typeof aString !== 'string' || !aString) {
|
|
|
|
|
throw new Error('The arg must be a valid, non empty string')
|
|
|
|
|
}
|
|
|
|
|
const characters = aString.split('')
|
|
|
|
|
let permutations = [[characters.shift()]]
|
|
|
|
|
while (characters.length) {
|
|
|
|
|
const currentCharacter = characters.shift()
|
2023-10-03 23:08:19 +02:00
|
|
|
permutations = calculateCurrentCharacterPermutation(
|
|
|
|
|
permutations,
|
|
|
|
|
currentCharacter
|
|
|
|
|
)
|
2020-10-11 19:00:38 +02:00
|
|
|
}
|
|
|
|
|
return permutations
|
2023-10-03 23:08:19 +02:00
|
|
|
.map((character) => character.join(''))
|
|
|
|
|
.filter((item, index, self) => self.indexOf(item) === index)
|
2020-10-11 19:00:38 +02:00
|
|
|
.sort()
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-03 23:08:19 +02:00
|
|
|
const calculateCurrentCharacterPermutation = (
|
|
|
|
|
allPermutations,
|
|
|
|
|
currentCharacter
|
|
|
|
|
) => {
|
2020-10-11 19:00:38 +02:00
|
|
|
const currentPermutations = []
|
2023-10-03 23:08:19 +02:00
|
|
|
allPermutations.forEach((permutation) => {
|
2020-10-11 19:00:38 +02:00
|
|
|
let index = 0
|
|
|
|
|
while (index <= permutation.length) {
|
|
|
|
|
const tmp = [...permutation]
|
|
|
|
|
tmp.splice(index, 0, currentCharacter)
|
|
|
|
|
currentPermutations.push(tmp)
|
|
|
|
|
index++
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
return currentPermutations
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export { permutate }
|