要求:輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串a(chǎn)bc,則打印出由字符a,b,c所能排列出來的所有字符串a(chǎn)bc,acb,bac,bca,cab和cba。
思路:使用全排列算法
方法見19_全排列遞歸算法
public class L39_permutation {
// 全排列算法
static ArrayList<String> res = new ArrayList<>();
static char[] c;
public static String[] permutation(String str) {
// 將字符串轉(zhuǎn)化為數(shù)組
c = str.toCharArray();
int len = c.length;
dfs(0,len);
// 將ArrayList轉(zhuǎn)化為字符數(shù)組,先把鏈表的每個值取出來,然后拼接到一起,隔著",",利用字符分割split(",")切分成數(shù)組
StringBuilder sb = new StringBuilder();
for(int i=0; i<=res.size()-1;i++){
sb.append(res.get(i)+",");
}
String[] val = sb.deleteCharAt(sb.length()-1).toString().split(",");
return val;
}
//遞歸
public static void dfs(int m, int len){
HashSet<Character> set = new HashSet<>();
if(m == len){
res.add(String.copyValueOf(c));
}else{
for(int i=m; i<len;i++){
// 如果有重復的字符,要剪掉,即相同的字母只固定一次
if(set.contains(c[i])) continue; // 重復,因此剪枝
set.add(c[i]);
// 交換,固定第一位
char temp = c[m];
c[m] = c[i];
c[i] = temp;
// 遞歸
dfs(m+1, len);
// 交換回去
temp = c[m];
c[m] = c[i];
c[i] = temp;
}
}
}
public static void main(String[] args) {
String[] str = permutation("abbb");
int len = str.length;
for(int i=0; i<len;i++){
System.out.println(str[i]);
}
}
}