题目
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解析(递归):
为方便起见,用123来示例下。123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来得231和312。因此可以知道——全排列就是从第一个数字起每个数分别与它后面的数字交换。找到这个规律后,递归的代码就很容易写出来了:
/**
*
*/
package com.Permutation;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
/**
* @author Home
*
*/
public class Solution {
/**
* @param args
*/
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
while(sc.hasNext()){
String str = sc.next();
ArrayList<String> al = new Solution().Permutation(str);
for(String s:al)
System.out.println(s);
}
sc.close();
}
public ArrayList<String> Permutation(String str) {
ArrayList<String> al = new ArrayList<String>();
char[] ch = str.toCharArray();
if(ch!=null&&ch.length>0){
PermutationHelper(ch,0,al);
}
Collections.sort(al);
return al;
}
private void PermutationHelper(char[] ch, int i, ArrayList<String> al) {
if(i==ch.length-1){
al.add(String.valueOf(ch));
}
for(int j=i;j<ch.length;j++)
{
if(j!=i&&ch[j]==ch[i]) continue;
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
PermutationHelper(ch,i+1,al);
temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
}
}
}