1. 本题知识点
字符串
2. 题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc,则按字典序打印出由字符 a,b,c 所能排列出来的所有字符串 abc,acb,bac,bca,cab 和 cba。
3. 解题思路
要求字符串的全排列,可以看成两步:
- 求所有可能出现在第一个位置的字符,即把第一个字符与后面的字符依次交换。
- 固定这个字符,求后面所有字符的排列。
显然这是典型的递归思路,递归出口就是对最后一个字符固定的时候。
4. 代码
public class Solution {
ArrayList<String> result = new ArrayList<>();
/**
* 返回字符串的全排序结果
* @param str
* @return
*/
public ArrayList<String> permutation(String str) {
// 字符串为空时
if (str == null || str.length() == 0) {
return result;
}
permutation(str.toCharArray(), 0);
// 从小到大排序
Collections.sort(result);
return result;
}
public void permutation(char[] str, int begin) {
// 对最后一个字符固定的时候,退出递归
if (begin == str.length - 1) {
// 去重
String s = String.valueOf(str);
if (!result.contains(s)) {
result.add(s);
}
} else {
for (int i = begin; i < str.length; i++) {
// 求所有可能出现在第一个位置的字符
swap(str, begin, i);
// 求后面所有字符的排列
permutation(str, begin + 1);
// 还原
swap(str, begin, i);
}
}
}
public void swap(char[] str, int i, int j) {
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}