问题描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。
输入描述:
输入一个字符串
输出描述:
输出字符串的所有排列
示例
示例1
输入
abc
输出
abc,acb,bac,bca,cab,cb
解决思路
分析
- 采用深度优先搜索遍历的方式,采用先固定某个元素,交换其他元素的方式。
方法
- 采用深度优先搜索遍历的方式,采用先固定某个元素,交换其他元素的方式。(后期会补图)
递归分析
递归参数:arr 字节数组,list 结果, i 下标
终止条件:终止条件:当i达到了字符数组的长度,添加结果
递归内容:
1、循环交换
1.1 判断字符是否相同,相同不交换
1.2 固定字符
1.3 开启下一层的递归
1.4 交换字符(回溯)
代码实现
// 思路1
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList<>();
if (str == null || "".equals(str) || str.length() == 0) {
return result;
}
getStr(str.toCharArray(), result, 0);
Collections.sort(result);
return result;
}
private void getStr (char[] arr, ArrayList<String> result, int i) {
if (i == arr.length - 1) {
result.add(new String(arr));
}
for (int j = i; j < arr.length; j++) {
// 如果下标不同并且字符相同,则跳过
if (i != j && arr[i] == arr[j]) {
continue;
} else {
// 交换
swap(arr, i, j);
// 递归
getStr(arr, result, i + 1);
// 回溯
swap(arr, i, j);
}
}
}
private void swap (char[] arr, int i, int j) {
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
时间复杂度分析:
O(N!) : N 为字符串 s 的长度;时间复杂度和字符串排列的方案数成线性关系,方案数为 N×(N−1)×(N−2)…×2×1 ,因此复杂度为 O(N!),即全排列的个数 。
空间复杂度分析:
全排列的递归深度为 N ,系统累计使用栈空间大小为 O(N);使用了额外的arr字符数组,空间大小为字符串 s 的长度 N,所以空间复杂度为O(N)
小伙伴如果想测试的话,可以直接到牛客网这个链接做测试