题目描述

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:

输入:s = “abc”
输出:[“abc”,”acb”,”bac”,”bca”,”cab”,”cba”]

限制:

1 <= s 的长度 <= 8

通过次数46,113提交次数84,766

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

暴力,无剪枝

  1. /**
  2. * @param {string} s
  3. * @return {string[]}
  4. */
  5. var permutation = function(s) {
  6. if (s.length <= 0) return [];
  7. src = s.split('');
  8. let res = [];
  9. let now = [];
  10. dfs(src, now, res);
  11. return res;
  12. };
  13. function dfs(src, now, res) {
  14. let tmp = src.slice();
  15. let len = tmp.length;
  16. if (len <= 0) {
  17. let str = now.join('');
  18. res.indexOf(str) < 0 && res.push(str);
  19. return ;
  20. }
  21. for (let i = 0; i < len; i++) {
  22. let c = tmp.splice(i, 1);
  23. if (now.indexOf(c) >= 0) continue;
  24. now.push(c);
  25. dfs(tmp, now, res);
  26. tmp.splice(i, 0, now.pop());
  27. }
  28. }

有剪枝,数据原地交换,速度快很多

  1. /**
  2. * @param {string} s
  3. * @return {string[]}
  4. */
  5. var permutation = function(s) {
  6. if (s.length <= 0) return [];
  7. let c = s.split('');
  8. let res = [];
  9. dfs(0, c, res);
  10. return res;
  11. };
  12. function swap(c, i, j) {
  13. let temp = c[i];
  14. c[i] = c[j];
  15. c[j] = temp;
  16. }
  17. function dfs(x, c, res) {
  18. if (x === c.length - 1) {
  19. res.push(c.join(''));
  20. return ;
  21. }
  22. let hash = {};
  23. // 前面的已经固定了位置了
  24. for (let i = x; i < c.length; i++) {
  25. if (hash[c[i]]) continue;
  26. hash[c[i]] = true;
  27. // 把当前选择固定在x的位置
  28. swap(c, i, x);
  29. dfs(x + 1, c, res);
  30. // 恢复之前的状态,进行下一个选择
  31. swap(c, i, x);
  32. }
  33. }