每次看到这题我都会重新写一遍。
- package test;
- public class Test5 {
-
- public static void main(String[] args) {
- printStringCombination("abcd");
- }
- //封装一下
- public static void printStringCombination(String string){
- String[] selected = {""};//初始化已选择字符串数组
- String[] toSelect = {string};//初始化待选择字符串数组
- combine(selected, toSelect, string.length());//开始选择
- }
- //打印组合的具体实现,需要递归
- private static void combine(String[] selected,String[] toSelect,int length) {
- if(length==0){//length为待选择字符串的长度,长度为0则退出方法
- return;
- }
- /*
- * ------------初始------------
- * 已选择:空串 对应未选择:abc
- * ------------选第一个------------
- * 已选择: 对应未选择:
- * a bc
- * b ac
- * c ab 共 1*3=3种
- * ------------选第二个------------
- * 已选择: 对应未选择:
- * ab c
- * ac b
- * ba c
- * bc a
- * ca b
- * cb a 共 3*2=6种
- * 每次选择得到的组合数为 上次已经选择的组合数*待选择字符串的长度
- */
- int combinations = selected.length*length;//每次选择得到的组合数
- String[] newSelected = new String[combinations];//新一轮已选择的组合
- String[] newToSelect = new String[combinations];//新一轮待选择的组合
- int count = 0;
- for (int i = 0; i < selected.length; i++) {
- for (int j = 0; j < length; j++) {
- newSelected[count] = selected[i]+toSelect[i].charAt(j);//选择一个字符拼接到已选择字符串上
- //把选择的字符从原待选择字符串中剔除
- newToSelect[count] = toSelect[i].substring(0,j)+toSelect[i].substring(j+1);
- System.out.print(newSelected[count++]+" ");//打印最新得到的组合
- }
- }
- System.out.println();//换行
- combine(newSelected, newToSelect, length-1);//递归进行一下次选择
- }
- }
复制代码
|