找出字符串的全部子序列

找出字符串的全部子序列

字符串的子序列是通过在保持顺序的同时从字符串中删除零个或多个字符来获得的。给定一个字符串,生成一个所有子序列按字母顺序升序排列的数组,忽略空字符串。

例子

s = " xyz "

不包括空字符串,排序子序列是{‘x’,‘xy’,‘xyz’,‘xz’,‘y’,‘yz’,‘z’}。

返回

Str[]:字符串数组,由给定字符串的所有子序列组成,按字母顺序升序排列。

约束

1.1<长度s<16

2.s是一个不同的小写英文字母ascii[a-z]

题目解析:给出一个任意的字符串,首先要把字符串要变成按顺序排列的字符串,可以先变成字符串List集合,用stream流的sort方法来对List进行排序,然后再拼接成一个有顺序的字符串,字符串的子序列是通过在保持顺序的同时从字符串中删除零个或多个字符来获得的,证明每一个元素都有可能需要,或者不要地进行组合。元素本身分情况的进行组合可以利用递归的方法。代码如下:
//寻找字符串所有子序列(递归)
public class test {


        public static void main(String[] args) {
            String test = "xyz";
            //转换成一个有序无空字符串的字符串
            String target =afterChange(test);

            List<String> ans1 = subList(target);

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

    private static String afterChange(String target) {
        //转换成字符数组
        char[] str = target.toCharArray();
        HashSet<String> targetStr = new HashSet<>();
        //去空字符串
        for (char c:str){
            String a =String.valueOf (c);
            if (!" ".equals (a)){
                targetStr.add ( a );
            }
        }
        //排序拼接成有序的字符串
        List<String> stringList = targetStr.stream()
                .sorted()
                .collect( Collectors.toList());
        String a= "";
        for (String c:stringList){
           a=a+c;
        }
        return a;

    }

    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]);
        }



}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值