输出任意数目组合的字符串


package com.xianfengshangtai.interview;

/**
* 题目:给定一个字符串,里面用空格分开为6个或者更多的子单元,如,01 02 03 04 05 06 06 08...
* 请写一个程序,返回任6个进行组合的所有字符串。请保持输出字符串中的元素顺序与原始顺序已知
* 示例:
* 输入:
* 01 02 03 04 05 06 07
* 输出的字符串数组为:
* 01 02 03 04 05 06
* 01 02 03 04 05 07
* 01 02 03 04 06 07
* 01 02 03 05 06 07
* 01 02 04 05 06 07
* 01 03 04 05 06 07
* 02 03 04 05 06 07
*
*/
public class Problem23_25 {
public static void main(String[] args) {
String input = "01 02 03 04 05 06 07";
String [] target = input.split(" ");
if(target.length>=6){
distil(null,target,6);
}
}

public static void distil(String[] selected,String[] target,int count){
if(target ==null||target.length<count){
return;
}


if(count==1||target.length==count){
//if(____________________)
String selectedStr = "";
if(selected!=null){
for(int i=0,cnt=selected.length;i<cnt;i++){
selectedStr += selected[i]+" ";
}
}
/**
* 如果要输出的子单元的的单元长度为1的话
* 则输出数组target里面的每个元素,每行一个元素
*/
if(count ==1){
for(int i=0,cnt=target.length;i<cnt;i++){
System.out.println(selectedStr+target[i]+" ");
}
}else{
/**
* 否则,一行输出数组target里面的所有元素
*/
for(int i=0,cnt=target.length;i<cnt;i++){
selectedStr +=target[i]+ " ";
}
System.out.println(selectedStr);
}
}else{
/**
* 生成新的target和selected数组
*/
String[] newSelected = null;
if(selected == null){
newSelected = new String[] {target[0]};
}else{
newSelected = new String[selected.length+1];
for(int i=0,cnt=selected.length;i<cnt;i++){
newSelected[i] = selected[i];
}
newSelected[selected.length] = target[0];
}
String [] newTarget = new String[target.length-1];
for(int i=1,cnt=target.length;i<cnt;i++){
newTarget[i-1] = target[i];
}
//distil(selected, newTarget, count);
distil(newSelected, newTarget, count-1);
//________________________
distil(selected, newTarget, count);
//________________________
}
}
}



运算结果:

01 02 03 04 05 06
01 02 03 04 05 07
01 02 03 04 06 07
01 02 03 05 06 07
01 02 04 05 06 07
01 03 04 05 06 07
02 03 04 05 06 07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值