题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:
代码:
public ArrayList<String> Permutation(String str) {
ArrayList<String> list = new ArrayList<String>();
// 输入合法性判断
if (str == null || str.isEmpty()) {
return list;
}
// set去重
HashSet<String> set = new HashSet<String>();
fun(set, str.toCharArray(), 0);
list.addAll(set);
// 排序
Collections.sort(list);
return list;
}
/**
* @param set
* @param str
* @param num num处的字符串依次和后面的交换
*/
private void fun(HashSet<String> set, char[] str, int num) {
// 已经全部交换过,结束
if (num == str.length) {
set.add(new String(str));
return;
}
for (int i = num ; i < str.length ; i++) {
swap(str, i, num);
fun(set, str, num + 1);
// 交换位置后要重新交换回来
swap(str, i, num);
}
}
void swap(char[] str, int i, int j) {
if (i != j) {
char tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}