递归实现输出一个若干字符串的全部顺序组合

很久没搞过这种,然后问到这个题,我知道该用递归去实现。
但是现场怎么都写不出来,回来之后认真思考了一下,在eclipse的调试之下终于成功了,
如果有什么问题欢迎交流指正。
题目是这样的,大概类似skipgram的计算,所以我就用这个名字替代了
给定一个字符串,or数组或者什么都好了。
假设字符都是不重复的,按顺序输出全部可能的组合,
例如输入数据是abcd,就是要求空串,a,ab,ac,ad,abc,....这种。

思路:
假设一个长度为n的数组,那么如果要输出一个长度为m的子数组。
从头开始遍历,由于结果是有序的,
那么对于当前位,分为使用和不使用两种。
1.使用当前位,那么递归的新数组从下一位开始,要输出的子数组的长度-1
2.不适用当前位,那么递归的新数组从下一位开始,要输出的子数组长度不变
3.当要输出的子数组长度为0时,输出累积的新数组,结束
4.当新数组为空时,直接结束
想清楚了问题,才容易解决

public class skipGram {
//用一个list去标识一个字符串。
    static List strlist = new ArrayList();
//初始化测试集
    public void initial(){
        strlist.add("a");
        strlist.add("b");
        strlist.add("c");
        strlist.add("d");
        strlist.add("e");
        strlist.add("f");
        System.out.println(strlist.subList(0, 6));
    }
    public void printSkipGram(List list){
                List strlist = new ArrayList();
              //按照输出子串的长度去区分
                for(int j = 0; j < list.size()+1; j++)
                    recurtion(list, j, strlist);
    }
//递归调用
    public void recurtion(List list,  int l, List strlist){
        if(l == 0){
            for(int i = 0; i < strlist.size(); i++){
                System.out.print(strlist.get(i));
            }
            System.out.println();
            return;
        }
        if(list.isEmpty())
            return;
        strlist.add(list.get(0));
              //主要是这个情况一开始没想清楚
        print(list.subList(1, list.size()), l-1, strlist);
        strlist.remove(strlist.size()-1);
        print(list.subList(1, list.size()), l, strlist);
    }
    public static void main(String[] args){
        skipGram ob = new skipGram();
        ob.initial();
        ob.printSkipGram(strlist);
    }
}

你可能感兴趣的:(递归实现输出一个若干字符串的全部顺序组合)