题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解答:借鉴一下别人的方法,记录一下自己的理解。
思路:
1:"a"和"b"肯定是不同的排列
2:通过交换字符来生成不同的排列
3:举例:"abc"的全排列即{(a+"bc"的全排列),(b+"ac"的全排列),(c+"ab"的全排列)},就是将第一个字符和后面任意一个字符交换,一直递归至只剩一个字符。
public class Q_27 {
ArrayList<String> Permutation(String str) {
ArrayList<String> list = new ArrayList<String>();
if (str.length() >= 1) {
PermutationHelper(str.toCharArray(), 0, list);
Collections.sort(list);
}
return list;
}
private void PermutationHelper(char[] chars, int i, ArrayList<String> list) {
if (i == chars.length - 1) {//只剩最后一个字符则添加到list
list.add(String.valueOf(chars));
} else {
Set<Character> set = new HashSet<>();
for (int j = i; j < chars.length; j++) {//循环交换后续的每一个字符
if (!set.contains(chars[j])) {//保证重复的字符不交换
set.add(chars[i]);
swap(chars, i, j);
PermutationHelper(chars, i + 1, list);
swap(chars, i, j);
}
}
}
}
private void swap(char[] cs, int i, int j) {
char temp = cs[i];
cs[i] = cs[j];
cs[j] = temp;
}
public static void main(String[] args) {
System.out.println(new Q_27().Permutation("asdfghjk"));
}}

京公网安备 11010502036488号