1.题目描述
输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。
数据范围:n<10n<10
要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)输入描述:
输入一个字符串,长度不超过10,字符只包括大小写字母。
示例1
输入:
"ab"复制返回值:
["ab","ba"]复制说明:
返回["ba","ab"]也是正确的示例2
输入:
"aab"返回值:
["aab","aba","baa"]示例3
输入:
"abc"返回值:
["abc","acb","bac","bca","cab","cba"]示例4
输入:
""返回值:
[""]
2.解题思路
思路与BM56相同,有重复项数字的全排列是使用ArrayList构建path,而本题res中保存的是String类型,所以我们需要使用一个StringBuilder构建path,去重思路为当前遍历到的元素和之前元素相同且前一个元素未被访问,则跳过这次循环。
3.代码实现
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return string字符串ArrayList
*/
public ArrayList<String> res = new ArrayList<>();
public StringBuilder path = new StringBuilder();
public ArrayList<String> Permutation (String str) {
// write code here
if (str.length() == 0) {
res.add(str);
return res;
}
char[] array = str.toCharArray();
Arrays.sort(array);
boolean[] visited = new boolean[array.length];
backTracking(array,visited);
return res;
}
public void backTracking(char[] array, boolean[] visited) {
if (path.length() == array.length) {
res.add(path.toString());
return;
}
for (int i = 0; i < array.length; i++) {
if (visited[i] || (i > 0 && array[i] == array[i-1] && visited[i-1] == false)) {
continue;
}
visited[i] = true;
path.append(array[i]);
backTracking(array,visited);
path.deleteCharAt(path.length()-1);
visited[i] = false;
}
}
}