求字符串的子集

之前参加了一次面试的笔试考试,里面有一道:求字符串的子集,例如求1234的子串,有1,2,3,4,12,13,14,23,24,34,123,124,134,234,1234..,当时居然没想出怎么做,后面进入二面的时候,面试官问了笔试这道题现在觉得应该怎么做,很遗憾的是我笔试之后没有认真的思考,吸取这次教训,参考了网上的一些思路,利用递归是最简单的方法求出一个字符串所有的子集。

集合中的所有元素对于每一个子集来说,都有两种可能性:在子集中或是不在子集中。
各个元素的这两种可能性组合起来,组成了一个集合的所有子集。每一个集合都有2^n个子集。真子集则为:(2^n)-1

我们把元素这种在或不在子集中状态,放置在boolean数组中。

/**
 * 求1234的子串,例如:1,2,3,4,12,13,14,23,24,34,123,124,134,234,1234
 * 
 * 集合中的所有元素对于每一个子集来说,都有两种可能性:在子集中或是不在子集中。
 * 各个元素的这两种可能性组合起来,组成了一个集合的所有子集。每一个集合都有2^n个子集。
 * 
 * 我们把元素这种在或不在子集中状态,放置在boolean数组中。
 * @author c
 *
 */
public class Test {


    private static void get_Subset(String str, int start, int end, boolean[] b) {
        // TODO Auto-generated method stub
        if(start==end){//当start==end时,即集合中的所有元素都已经在或者不在该子集中,输出该子集后,return跳出该层递归。 
            int i = 0;
            for(;i<end;i++){
                if(b[i]){
                    System.out.print(str.charAt(i));
                }
            }
            System.out.print(" ");
            return ;
        }else{
            b[start] = false;//代表数组中索引为start的元素不在该子集中
            get_Subset(str, start+1, end, b);//而后进入递归,元素索引向后加一,同样索引为start+1的元素也有在或者不在该子集中两种可能性
            b[start] = true;
            get_Subset(str, start+1, end, b);
        }
    }

    public static void main(String[] args) {
        String str = "1234";
        //我们把元素这种在或不在子集中状态,放置在boolean数组中。
        boolean []b = new boolean[str.length()];
        get_Subset(str,0,str.length(),b);
    }

}

这里写图片描述

结果如下:
这里写图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值