mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-05 08:16:50 +08:00

* chore: Switch to Node 20 + Vitest * chore: migrate to vitest mock functions * chore: code style (switch to prettier) * test: re-enable long-running test Seems the switch to Node 20 and Vitest has vastly improved the code's and / or the test's runtime! see #1193 * chore: code style * chore: fix failing tests * Updated Documentation in README.md * Update contribution guidelines to state usage of Prettier * fix: set prettier printWidth back to 80 * chore: apply updated code style automatically * fix: set prettier line endings to lf again * chore: apply updated code style automatically --------- Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Co-authored-by: Lars Müller <34514239+appgurueu@users.noreply.github.com>
40 lines
1006 B
JavaScript
40 lines
1006 B
JavaScript
'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()
|
|
permutations = calculateCurrentCharacterPermutation(
|
|
permutations,
|
|
currentCharacter
|
|
)
|
|
}
|
|
return permutations
|
|
.map((character) => character.join(''))
|
|
.filter((item, index, self) => self.indexOf(item) === index)
|
|
.sort()
|
|
}
|
|
|
|
const calculateCurrentCharacterPermutation = (
|
|
allPermutations,
|
|
currentCharacter
|
|
) => {
|
|
const currentPermutations = []
|
|
allPermutations.forEach((permutation) => {
|
|
let index = 0
|
|
while (index <= permutation.length) {
|
|
const tmp = [...permutation]
|
|
tmp.splice(index, 0, currentCharacter)
|
|
currentPermutations.push(tmp)
|
|
index++
|
|
}
|
|
})
|
|
return currentPermutations
|
|
}
|
|
|
|
export { permutate }
|