输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
不使用HashSet去重,采用剪枝操作
class Solution {
public String[] permutation(String s) {
List<String> list=new ArrayList<>();
char[] ch=s.toCharArray();
backtrack(0,list,ch);
String[] ans=new String[list.size()];
int i=0;
for(String temp:list) ans[i++]=temp;
return ans;
}
public void backtrack(int index,List<String> list,char[] ch){
if(index==ch.length){
list.add(new String(ch));
return;
}
for(int i=index;i<ch.length;i++){
if(judge(ch,index,i)==false) continue;
char c=ch[i];
ch[i]=ch[index];
ch[index]=c;
backtrack(index+1,list,ch);//这里是start
c=ch[i];
ch[i]=ch[index];
ch[index]=c;
}
}
public boolean judge(char[] ch,int i,int j){
for(;i<j;i++){
if(ch[i]==ch[j]) return false;
}
return true;
}
}
HashSet去重
class Solution {
HashSet<String> hash=new HashSet<>();
char[] ch;
public String[] permutation(String s) {
this.ch=s.toCharArray();
backtrack(0);
String[] ans=new String[hash.size()];
int i=0;
for(String temp:hash) ans[i++]=temp;
return ans;
}
public void backtrack(int start){
if(start==ch.length){
String str=new String(ch);
hash.add(str);
return;
}
for(int i=start;i<ch.length;i++){
char c=ch[i];
ch[i]=ch[start];
ch[start]=c;
backtrack(start+1);
c=ch[i];
ch[i]=ch[start];
ch[start]=c;
}
}
}