用非递归方法实现 求解字符串组合的问题 JAVA代码

求解一个字符串的所有组合,比如“abcd”,则用数0001 - 1111。来表示某位为0时表示字符串中相应的字符无,为1时表示相应的字符有。
所以实现一个字符串的二进制数,令其能实现加1的运算。代码如下。主函数中是测试代码

package AlgorithmTest;

/**
 * Created by dell on 2015/10/6.
 */
public class StringGroupNotRecursionTest {
    public static void main(String[] args) {
         String str = "abc";
        StringGroupNotRecursionUtil.printStringGroup(str);
    }
}

class StringGroupNotRecursionUtil{
    public static void printStringGroup(String str){
         BinaryNum num = new BinaryNum(str.length());
         while (num.increseOne()){
             char[] numChar = num.getNum();
             for (int i = 0; i < numChar.length; ++i){
                 if (numChar[i] == '1'){
                     System.out.print(str.charAt(i));
                 }
             }

             System.out.print("\n");
         }
    }
}

class BinaryNum{
    public static void main(String[] args) {
        BinaryNum num = new BinaryNum(4);
        while(num.increseOne()){
            num.print();
        }
    }
    private char[] num;
    private boolean enable = true;
    public BinaryNum(int length){
      num = new char[length];
        for (int i = 0; i < num.length; ++i){
            num[i] = '0';
        }
    }

    public boolean increseOne(){
        if (enable){
            int index = num.length - 1;
            for (; index >=0 && '0' != num[index]; --index){
                num[index] = '0';
            }

            if (index >= 0 &&  '0' == num[index]){
                num[index] = '1';
            }

            if (index < 0){
                enable = false;
            }
        }
        return enable;
    }

    public char[] getNum(){
        if (enable){
            return num;
        }else{
            return null;
        }
    }

    public void print(){
        if (enable){
            for (char c : num){
                System.out.print(c);
            }
            System.out.print("\n");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值