解题思路
利用递归将每个位置可能的字符全部遍历一遍并标记,进行拼串,如果字符串长度与str长度相同,那么久加入Set集合,这样同时也可以去除重复的排列
比如ABC
固定A->ABC->ACB
固定B->BAC->BCA
代码
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
char[] chars =str.toCharArray();
boolean[] flag = new boolean[str.length()];
Arrays.fill(flag,false);
HashSet<String> set = new HashSet<>();
String s = "";
dfs(chars,flag,s,set,str.length());
ArrayList<String> ans = new ArrayList<>();
for (String string :
set ) {
ans.add(string);
}
Collections.sort(ans);//因为题目的检测是需要有序的比如aab应该在aba前面
return ans;
}
public void dfs(char[] chars, boolean[] flag, String ans, HashSet<String> set,int leng){
System.out.println(ans);
if (ans.length()==leng){//长度相同
set.add(ans);
}
for (int i=0;i<flag.length;i++){
if (flag[i]==false){
flag[i]=true;
ans+=chars[i];
dfs(chars,flag,ans,set,leng);
flag[i]=false;
ans=ans.substring(0,ans.length()-1);//将字符串恢复
/*
比如AB拼成ABC后,应该让ABC恢复为A,这样才能
有AC的排列
*/
}
}
}
}