问题描述:
输入一串不重复的字符串,输出所有字符的全排列。例如输入“abc” 输出”abc” “acb” “bac” “bca” “cab” “cba” 。
思路:
对于输入的字符串,固定其首位,每次让第一位和后面的某一位交换,变成新的字符串,然后对去掉首位的字符串求全排列。
如abc ,先固定a,然后求bc的全排列 , 得到abc 和abc
然后交换a和b,得到bac,然后固定b,求ac的全排列,得到bac和bca。
换回a和b。
最后交换a和c,得到cba,固定c,求ba全排列,得到cba 和cab。
每次求完换位后的全排列 在下次交换之前,要换回原来的顺序。
递归代码:
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String string = input.nextLine();
//从0位开始求全排列
solution(string.toCharArray(),0);
}
public static void solution(char[] str,int index){
if(index >= str.length){
return;
}
//到了最后一位,可以输出
if(index == str.length - 1){
System.out.println(String.valueOf(str));
}
else{
for(int i=index;i<str.length;i++){
//交换首位和其他位的字符
char temp = str[index];
str[index] = str[i];
str[i] = temp;
//求字串的全排列
solution(str,index+1);
//换回原顺序
temp = str[i];
str[i] = str[index];
str[index] = temp;
}
}
}
——新增——-
升级版题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:
1、用TreeSet可以直接实现去重和排序,(虽然有取巧的嫌疑),核心代码不变。
2、也可以用set去重,然后结果排序。
合理利用数据结构,高效!