一、题目
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
限制:
1 <= s 的长度 <= 8
二、解决
1、DFS
思路:
排列方案数量:对长度为 n 的字符串,排列共有 n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ . . . ∗ 2 ∗ 1 n*(n-1)*(n-2)*...*2*1 n∗(n−1)∗(n−2)∗...∗2∗1 种方案。
大概过程:根据字符串排列特点,考虑用DFS搜索所有排列方案。先固定第1个(n种情况)字符,再固定第二位(n-1)字符,最后固定第 n 位字符(1种情况)。
重复方案与剪枝:遇到重复字符不交换,直接跳过,如下图所示。
这里再附一下DFS代码模板,参照理解。
public List<Integer> dfs(Node root, int curLayer, List<Integer> result) {
// 终止条件
if (root == null || curlayer > n) return result; // 数据非法
if (curLayer.val == true) {
// 满足条件
result.add(xxx); // xxx: node.val / curlayer / path
return result;
}
if (canCutBranch()) return result;
visited[root] = true; // 标记:处理当前顶点,记录为已访问
for (Node next : root