输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
Idea
看到别人用的好的方法放到这里,共勉
Code
1.回溯法
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> res = new ArrayList<String>();
if(str==null||str.length()==0){
return res;
}
HashSet<String> set=new HashSet<String>();
fun(set,str.toCharArray(),0);
res.addAll(set);
Collections.sort(res);
return res;
}
private static void fun(HashSet<String> set,char[] str,int k){
if(k==str.length){
set.add(new String(str));
return;
}
for(int i=k;i<str.length;i++){
swap(str,i,k);
fun(set,str,k+1);
swap(str,i,k);
}
}
private static void swap(char[] str,int i,int j){
char tmp=str[i];
str[i]=str[j];
str[j]=tmp;
}
}
2.dfs
import java.util.*;
public class Solution {
private char[] seqs;
private Integer[] book;
private HashSet<String> result=new HashSet<String>();
public ArrayList<String> Permutation(String str){
ArrayList<String> arrange=new ArrayList<String>();
if(str==null||str.isEmpty()) return arrange;
char[] strs=str.toCharArray();
seqs=new char[strs.length];
book=new Integer[strs.length];
for(int i=0;i<book.length;i++){
book[i]=0;
}
dfs(strs,0);
arrange.addAll(result);
Collections.sort(arrange);
return arrange;
}
private void dfs(char[] arrs,int step){
//走完所有可能 记录排列
if(arrs.length==step){
String str="";
for (int i=0;i<seqs.length;i++){
str+=seqs[i];
}
result.add(str);
return; //返回上一步
}
//遍历整个序列,尝试每一种可能
for (int i=0; i<arrs.length;i++){
//是否走过
if(book[i]==0){
seqs[step]=arrs[i];
book[i]=1;
//下一步
dfs(arrs,step+1);
//走完最后一步 后退一步
book[i]=0;
}
}
}
}