1、最简单全排列,需要0.8秒,concat不改变原数组,返回新数组
function permutation(str, select = []) {
if (str.length === select.length) {
return select.map((item) => str[item]).join("");
}
let result = [];
for (let i = 0; i < str.length; i++) {
if (select.indexOf(i) === -1) {
result = result.concat(permutation(str, select.concat(i)));
}
}
return result;
}
console.log(permutation("abcdefghi"));
2、基于交换全排列,需要0.15秒
function swap(A, i, j) {
const t = A[i];
A[i] = A[j];
A[j] = t;
}
function join(list) {
let s = "";
for (let i = 0; i < list.length; i++) {
s += list[i];
}
return s;
}
function permutation(str) {
let r = [];
function perm(A) {
const c = Array(A.length).fill(0);
r.push(A.join(""));
for (let i = 0; i < A.length; ) {
if (c[i] < i) {
swap(A, i & 1 ? c[i] : 0, i);
r.push();
c[i]++;
i = 0;
r.push(join(A));
} else {
c[i++] = 0;
}
}
}
perm([...str]);
return r;
}
console.log(permutation("abcdefghi"));