题目描述
亮亮深吸一口气,小心地将盒子打开,里面是一张地图,地图上除了一些奇怪的字母以外没有任何路线信息,这可让亮亮犯了愁,这些字母代表了什么意思呢? 亮亮绞尽脑汁也想不出什么思路,突然,亮亮眼前一亮,“我可以把这些字母所有的排列方式全部写出来,一定可以找到答案!” 于是,亮亮兴奋的开始寻找字母里的秘密。
输入描述:
每组数据输入只有一行,是一个由不同的大写字母组成的字符串,已知字符串的长度在1到9之间,我们假设对于大写字母有'A' < 'B' < ... < 'Y' < 'Z'。
输出描述:
输出这个字符串的所有排列方式,每行一个排列,要求字母序比较小的排列在前面。
输入例子:
WHL
输出例子:
HLW HWL LHW LWH WHL WLH
import java.util.Arrays; import java.util.Scanner;
public class Main { public static void main(String[] args){ Scanner scan = new Scanner(System.in); while(scan.hasNext()){ String key = scan.nextLine(); String[] result = QuanPaiLie(key); Arrays.sort(result); for(int i = 0 ; i < result.length ; i++){ System.out.println(result[i]); } } scan.close(); } /** * 求字符串的全排列 * 算法思想:递归 * 比如 abcde 先求出abcd的全排列,然后将e分别插入全排列的5个位置 * a 全排列 a * ab 全排列 ab ba * abd 全排列即是 cab acb abc cba bca bac */ private static String[] QuanPaiLie(String key) { //如果字符串是空字符串“”,或者是空对象 if(key == null || key.isEmpty()){ return null; } int length = key.length(); //计算全排列后的字符串个数 int num = length; int sum = 1; while(num != 0){ sum *= num; num--; } String[] result = new String[sum];//保存生成的全排列字符串 if(length == 1){ result[0] = key; }else if(length == 2){ result[0] = key; result[1] = "" + key.charAt(1) + key.charAt(0); }else{ //length>2使用递归 char end = key.charAt(length - 1);//保存结尾的字符 String frontStr = key.substring(0, length - 1);//截取除过结尾字符以外的字符串 String[] frontStrResult = QuanPaiLie(frontStr) ;//递归 //将结尾字符插入到生成字符串的各个位置 int frontResultNum = frontStrResult.length;//生成的字符串个数 int insertPlace = frontStrResult[0].length() + 1;//可以插入的位置 = 生成字符串的长度 + 1 int resultIndex = 0; for(int i = 0 ; i < frontResultNum ; i++){ String tempResult = frontStrResult[i]; for(int index = 0 ; index < insertPlace ; index++){ result[resultIndex++] = tempResult.substring(0 , index) + end + tempResult.substring(index); } } } return result; }
}