题目
输入一个字符串,打印出该字符串中字符的所有排列。可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
思路
代码
public String[] permutation(String s) {
int length = s.length();
if(length==0) return new String[0];
List<String>res = new ArrayList<>();
char[]ch = s.toCharArray();
// 排序是为了去重
Arrays.sort(ch);
StringBuilder path = new StringBuilder();
boolean[]used = new boolean[length];
dfs(ch,0,used,length,res,path);
//要换成字符串数组
return res.toArray(new String[0]);
}
//类似于全排列,记录过程的变量相当于有两个, 一个是depth(遍历完)一个是used(去重)
public void dfs(char []ch, int depth, boolean []used, int length, List<String> res, StringBuilder path){
if(depth==length){
res.add(path.toString());
return;
}
for(int i = 0;i<length;i++){
if(!used[i]){
//给出的字符串会存在重复元素
// i>=1:防止ch[i-1]下标越界
//ch[i]==ch[i-1]:与前一个元素 的值相同
//used[i-1]==false:前一个元素和这个元素相同并且刚被撤销,不可以用,因为还是重复的。如果前一个没被用过可以进行排列
if(i>=1&&ch[i]==ch[i-1]&&!used[i-1]){
continue;
}
path.append(ch[i]);
used[i]=true;
dfs(ch,depth+1,used,length,res,path);
used[i]=false;
//注意删除方法
path.deleteCharAt(path.length()-1);
}
}