题目描述
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
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/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。