前端算法之全排列

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"));
posted @ 2022-03-15 10:17  jerry-mengjie  阅读(92)  评论(0)    收藏  举报