题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
分析:
1、把字符串分成两部分,一部分是第一个字符,另一个部分是后面其余的字符串
2、拿第一个字符和后面的字符串依次交换,这是一个递归的过程
3、注意:在递归里第一次交换是自身和自身的交换,保证不缺少字符串
import java.util.ArrayList;
import java.util.Collections;
import org.junit.Test;
public class Solution {
private ArrayList<String> list = new ArrayList<String>();
public ArrayList<String> Permutation(String str) {
char[] array = str.toCharArray();
getList(array, 0, array.length - 1);
Collections.sort(list); // 排序
return list;
}
private void getList(char[] array, int start, int end) {
if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
list.add(new String(array));
} else {// 多个字母全排列
for (int i = start; i <= end; i++) {
if (array[start] == array[i] && i != start) {
continue;
} // aab这种情况,需要去除字母相同当不是本身字母的情况,(注意是两个判断!)
else {
char temp = array[start];// 交换数组第一个元素与后续的元素&保留本身
array[start] = array[i];
array[i] = temp;
getList(array, start + 1, end);// 后续元素递归全排列
temp = array[start];// 将交换后的数组还原
array[start] = array[i];
array[i] = temp;
}
}
}
}
}