很久没搞过这种,然后问到这个题,我知道该用递归去实现。
但是现场怎么都写不出来,回来之后认真思考了一下,在eclipse的调试之下终于成功了,
如果有什么问题欢迎交流指正。
题目是这样的,大概类似skipgram的计算,所以我就用这个名字替代了
给定一个字符串,or数组或者什么都好了。
假设字符都是不重复的,按顺序输出全部可能的组合,
例如输入数据是abcd,就是要求空串,a,ab,ac,ad,abc,....这种。
思路:
假设一个长度为n的数组,那么如果要输出一个长度为m的子数组。
从头开始遍历,由于结果是有序的,
那么对于当前位,分为使用和不使用两种。
1.使用当前位,那么递归的新数组从下一位开始,要输出的子数组的长度-1
2.不适用当前位,那么递归的新数组从下一位开始,要输出的子数组长度不变
3.当要输出的子数组长度为0时,输出累积的新数组,结束
4.当新数组为空时,直接结束
想清楚了问题,才容易解决
public class skipGram {
//用一个list去标识一个字符串。
static List<String> strlist = new ArrayList<String>();
//初始化测试集
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<String> list){
List<String> strlist = new ArrayList<String>();
//按照输出子串的长度去区分
for(int j = 0; j < list.size()+1; j++)
recurtion(list, j, strlist);
}
//递归调用
public void recurtion(List<String> list, int l, List<String> 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);
}
}
网友评论