题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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; } }