递归--字符串的全部子序列和不重复的子序列(java)

文章介绍了如何使用Java编程解决字符串的全部子序列问题,包括如何避免生成重复的子序列。通过递归方法,分别展示了无重复子序列的生成过程,并提供了具体的代码实现。

字符串的全部子序列

题目描述:
示例: String str = “abs”;
字序列是: “” , s , b , bs, a
as
ab
abs
空字符串也是字序列

解题思路

全部子序列就是把abs 这个字符串全部拆成单个char字符,每个位置都有可能选,有可能不选。
因此递归就有了,这个位置上的字符选和不选两种情况,都要递归。

代码演示

  /**
     * 所有子序列
     * @param str
     * @return
     */
    public static List<String> subStrSeq(String str){
        if (str == null || str.equals("")){
            return null;
        }
        char[] chars = str.toCharArray();
        //存储答案
        ArrayList<String> ans = new ArrayList<>();
        process(chars,0,ans,"");
        return ans;
    }

    /**
     * 
     * @param str 字符数组
     * @param index 下标位置
     * @param ans 保存答案
     * @param path 已经选择过的结果
     */
    public static void process(char[]str, int index, List<String> ans,String path){
        //base case
        if (index == str.length){
            ans.add(path);
            return ;
        }
        //path z作为上一步的选择结果,来到当前位置,当前位置的字符也是有选和不选两种情况。
        //不选的情况
        process(str,index + 1,ans,path);
        //选择当前字符的情况。
        process(str,index + 1,ans,path+String.valueOf(str[index]));
    }

打印一个字符串的全部子序列,要求不要出现重复字面值的子序列

解题思路:
过程和上面一样,只需要把返回的结果用HashSet 去重一下就行了,直接看代码吧,不解释了

  /**
     * 所有子序列 去除重复字面值的子序列
     * @param str
     * @return
     */
    public static  HashSet<String> subStrSeq1(String str){
        if (str == null || str.equals("")){
            return null;
        }
        char[] chars = str.toCharArray();
        //存储答案
        HashSet<String> ans = new HashSet<>();
        process1(chars,0,ans,"");
        return ans;
    }

    /**
     *
     * @param str 字符数组
     * @param index 下标位置
     * @param ans 保存答案
     * @param path 已经选择过的结果
     */
    public static void process1(char[]str, int index, HashSet<String> ans,String path){
        //base case
        if (index == str.length){
            ans.add(path);
            return ;
        }
        //path z作为上一步的选择结果,来到当前位置,当前位置的字符也是有选和不选两种情况。
        //不选的情况
        process1(str,index + 1,ans,path);
        //选择当前字符的情况。
        process1(str,index + 1,ans,path+String.valueOf(str[index]));
    }

递归–汉诺塔问题(java)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值