跳至主要內容

回溯算法题

ZiHao...小于 1 分钟记录算法

输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
输入:s = "abc" 输出:["abc","acb","bac","bca","cab","cba"]

/**
 * @param {string} s
 * @return {string[]}
 * 全排列算法:
 *   固定位置依次递归交换位置穷举出所有的可能性。
 */
var permutation = function (s) {
  const char = s.split("");
  const res = [];
  const dsf = function (n) {
    // 递归的出口,如果是遍历到最后一个位置此方法就解了
    if (n === char.length) {
      res.push(char.join(""));
      return;
    }
    const catSet = new Set();
    for (let i = n; i < char.length; i++) {
      //如果有相同的交换,则不需要处理枝减。
      if (catSet.has(char[i])) continue;
      catSet.add(char[i]);
      // 被固定的位置和其他位置依次交换位置
      {
        const t = char[n];
        char[n] = char[i];
        char[i] = t;
      }
      // 递归下一个位置
      dsf(n + 1);
      // 被交换的位置需要回溯归位。
      {
        const t = char[n];
        char[n] = char[i];
        char[i] = t;
      }
    }
  };
  dsf(0);
  return res.sort();
};
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.5