题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:把原字符串看成两部分:第一个字符,后面的所有字符。后面的字符又可看成:第一个字符,后面的字符…这是一个递归的过程。每一步划分需要执行以下动作:将第一个字符与后面的字符逐个交换,比如abc–>bac,abc–>cba,每次交换都需要还原原来的顺序,如在abc–>bac后,需还原bac–>abc,然后abc–>cba。结束条件:到达字符串末尾。
代码如下:
/**
*
*/
package com.su.biancheng;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
/**
* @title Permutation.java
* @author Shuai
* @date 2016-5-4下午4:12:40
*/
public class Permutation {
public static ArrayList<String> Permutation(String str) {
ArrayList<String> list = new ArrayList<String>();
if(str==null||str.length()<=0)
return list;
list=Permutation(list,str.toCharArray(),0,str.length());
Collections.sort(list);
return list;
}
public static ArrayList<String> Permutation(ArrayList<String> list,
char[] str, int begin, int end) {
if(begin==end-1){
if(!list.contains(String.valueOf(str))){
list.add(String.valueOf(str));
}
}
else{
for(int i=begin;i<end;i++){
if(i==begin||str[i]!=str[begin]){
swap(str,i,begin);
Permutation(list,str,begin+1,end);
swap(str,i,begin);
}
}
}
return list;
}
public static void swap(char[] str, int i, int begin) {
char temp=str[i];
str[i]=str[begin];
str[begin]=temp;
}
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str=in.nextLine();
System.out.println(Permutation(str).toString());
}
}