递归 字符串全排序

223 阅读1分钟

题目

给定一个字符串,获取该字符串所有的排列结果

  • 假设给定的字符串为abcd
  • 那么第一位的结果有四种a、b、c、d
  • 第二位的结果有三种b、c、d
  • 第三位的结果有两种c、d
  • 最后一位的结果只有一种d
  • 那么在进行遍历时,就需要将当前位置和它之后的所有字符做交换,同理当前位置后的字符也是
  • 全排列就是交换,i 和 j 交换后,以当前为前缀,开启后面的递归,递归终止条件是到达数组长度后,然后回溯恢复交换前结果,继续递归
function sortAll(str) {
  let strArr = str.split("");
  let res = [];
  function record(strArr, i) {
    if (i === strArr.length) {
      res.push(strArr.slice());
      return;
    }
    // 全排列,交换当前位置字符和其之后的所有字符
    for (let j = i; j < strArr.length; j++) {
      [strArr[i], strArr[j]] = [strArr[j], strArr[i]];
      record(strArr, i + 1);
      // 每次交换结束后,按照递归路径进行还原,避免影响后续结果
      [strArr[j], strArr[i]] = [strArr[i], strArr[j]];
    }
  }

  record(strArr, 0);

  console.log(res);
  return res;
}

sortAll("abc");