题目描述
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
1 | 输入:s = "abc" |
限制:1 <= s的长度 <= 8
思路
- 排列方案数量:长度为n的字符串(若不重复),排列共有
n*(n-1)*(n-2)...*2*1种 - 方案生成方法:
dfs所有排列方案。通过字符交换,先固定第1位字符(n种情况)、再固定第2位字符(n-1种情况)、… 、最后固定第n位字符(1种情况)。

- 重复方案:当存在重复字符时,排列方案也存在重复。为排除重复方案,需在固定某位字符时,保证 “每种字符只在此位固定一次” ,即遇到重复字符时不交换,直接跳过。从 DFS 角度看,此操作称为 “剪枝” 。

- 递归解析:
- 终止条件:当
x=len(c)-1时,代表所有位已固定,将当前组合c转成字符串加入result并返回 - 参数:当前固定位
x - 递归流程:
- 剪枝:若
c[i]在set中,代表重复,则剪枝 - 将
c[i]加入set - 固定:将
c[i]和c[x]交换,即固定c[i]为当前位字符 - 向下层递归:
dfs(x+1) - 还原交换:将
c[i]和c[x]交换(换回来)
- 剪枝:若
- 终止条件:当
代码
1 | class Solution{ |
思路参考大佬
作者:jyd
链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/mian-shi-ti-38-zi-fu-chuan-de-pai-lie-hui-su-fa-by/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。