输出一个字符串的全部子序列--java

描述:

依次打印输出一个字符串的全部子序列, 包括空字符串

比如:"abc"

输出结果:

 c
 b
 bc
 a
 ac
 ab
 abc

=========

1、实现方案:通常采用递归的思路来解决。

2、分析:str 固定字符串参数 ,到了str[index]字符,index是位置,str[0..index-1]已经走过了!之前的决定,都在path上,并且已经不能改变了。str[index....]还能决定,之前已经确定,而后面还能自由选择的话,把所有生成的子序列,放入到ans里去。

3、核心代码:

public class NanDaoPrintAllSubs {

    public static void main(String[] args) {
        String test = "abc";
        List<String> ans1 = subList(test);

        //如果打印非重复子序列,可用数据结构
       // HashSet<String> ans1 = new HashSet<>();
        for(String ans :  ans1){
            System.out.println(ans);
        }
        System.out.println("=========");
    }

    private static List<String> subList(String test) {
        //转换成字符数组
        char[] str = test.toCharArray();
        String path = " ";
        List<String> ans = new ArrayList<>();
        process(str,0,ans,path);
        return ans;

    }

    private static void process(char[] str, int index, List<String> ans, String path) {
        if(index == str.length){
            // 把所有生成的子序列,放入到ans里去
            ans.add(path);
            return;
        }
        // 没有要index + 1位置的字符
        process(str,index + 1,ans,path);

        // 要了index + 1位置的字符
        process(str,index + 1,ans,path + str[index]);
    }

}

执行结果:

到此,该算法分析完成,采用递归方案,当然也有其他思路,小伙伴可以尝试一下,定会惊喜多多! 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值