黑马程序员技术交流社区
标题:
字符串的排列组合
[打印本页]
作者:
hadesi
时间:
2015-7-12 01:38
标题:
字符串的排列组合
输入一个字符串,打印该字符串任意个数字符所有可能的排列组合。
在网上看了几个方法都无法实现,或者存在漏洞,希望能解答。
作者:
hnyzhlq
时间:
2015-7-12 01:38
import java.util.*;
import java.io.*;
import java.lang.reflect.*;
public class Test {
public static void main(String[] args) {
System.out.println("请输入一个字符串:");
//实例化Scanner工具类,获取封装后的标准输入流
Scanner input = new Scanner(System.in);
String str = input.nextLine();
input.close();
showStr(str);
}
/**
* 计算并输入字符串的全字符组合情况
*/
public static void showStr(String str) {
char[] array = str.toCharArray();
String[]strs=new String[array.length];
for (int i = 0; i < array.length; i++) {
strs[i]=""+array[i];
}//构建初始字符串元素数组
printObj(strs);//输出第一行排列情况
for (int i = 1; i < array.length; i++) {
//getAmn方法用于计算第(i+1)行字符排列情况的总数
strs=getNewStrs(array,strs,getAmn(array.length,i+1));
printObj(strs);//输出第(i+1)行排列情况
}
}
/**
* 计算字符排列情况的总数
* 排列,就是指从给定个数的元素中取出指定个数的元素进行排序
*/
private static int getAmn(int length, int i) {
//System.out.print("A(" + length + "," + i + ")=");
int sum = 1;
while (i != 0) {
sum *= (length--);
i--;
}
//System.out.println(sum);
return sum;
}
/**
* 根据前一行的组合,获取新组合
*/
private static String[] getNewStrs(char[] array, String[] strs,int sum) {
String[]newStrs=new String[sum];
int count=0;
for (int i = 0; i < strs.length; i++) {
for (int j = 0; j < array.length; j++) {
if(strs[i].indexOf(array[j])<0){
newStrs[count++]=strs[i]+array[j];
}
}
}
System.out.println(newStrs[0]);
return newStrs;
}
/**
* 输出指定内容
*/
private static void printObj(Object obj) {
Class<? extends Object> clazz=obj.getClass();
if(clazz.isArray()){
int len=Array.getLength(obj);
for(int i=0;i<len;i++)
System.out.print("\""+Array.get(obj, i)+"\""+"\t");
}else{
System.out.println(obj);
}
System.out.println();
}
}
复制代码
借花献佛,看到别人的思路,自己改良了下代码,希望能帮助到你。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2