1题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
2解题思路
把字符串分为两部分:一部分是字符串的第一个字符,另一部分是第一个字符以后的所有字符。
- 第一步是求所有可能出现在第一个位置的字符,即把第一个字符和后面所有字符交换。(for循环、交换操作)
- 第二步是固定住第一个字符,求后面所有字符的排列。(递归)
- 而“求后面所有字符的排列”即可按照上面的思路递归进行。
3.编程实现(Java):
public class Permutation_52 {
ArrayList<String> res = new ArrayList<>();
public ArrayList<String> Permutation(String str) {
if (str == null || str.length() == 0)
return res;
PermutationHelper(str.toCharArray(), 0);
Collections.sort(res);
return res;
}
private void PermutationHelper(char[] chars, int begin) {
//已经递归到了字符串最后一位,判断集合中有没有这个字符串,没有则加入
if (begin == chars.length - 1) {
String s = String.valueOf(chars);
if (!res.contains(s))
res.add(s);
} else {
//首次传进来的i为0,代表首位字符
//依次处理begin与begin后面的每个字符(索引i)交换
for (int i = begin; i < chars.length; i++) {
swap(chars, begin, i);//交换
PermutationHelper(chars, begin + 1);
swap(chars, begin, i);//还原
}
}
}
private void swap(char[] chars, int a, int b) {
char temp = chars[a];
chars[a] = chars[b];
chars[b] = temp;
}
}