题目描述 :输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,
c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
/**
*
* @author zy
* @date 2017年10月4日 下午7:01:59
* @Decription 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,
* c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述:
* 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
*
*
*/
public class Ex17 {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList<>();
if (str == null || str.length() == 0) {
return result;
}
HashSet<String> set = new HashSet<>();
permutationHelper(set, str.toCharArray(), 0);
result.addAll(set);
Collections.sort(result);
return result;
}
//全排列算法
void permutationHelper(HashSet<String> set,char[] cs,int k){
if (k == cs.length) {
set.add(new String(cs));
return;
}
for(int i=k;i<cs.length;i++){
swap(cs, i, k);
permutationHelper(set, cs, k+1);
swap(cs, i, k);
}
}
//交换字母位置算法
void swap(char[] cs,int i,int j){
if (i!=j) {
char temp = cs[i];
cs[i] = cs[j];
cs[j] = temp;
}
}
}