比如说给你一个字符串"dfadcdcad",让你排列出所有的子串,比如说df就是,dc也是,如果子串中有重复,可以打印出,因为题目如果说改成不能有重复,改成hashset即可,子串可以有间隔,这又是一个要与不要的问题,和0-1背包很像,但是0-1背包要返回最大价值,所以在细节处理上有些区别。要与不要的问题核心都是有一个index伴随递归的开始到结束,这就体现了暴力递归的思想。
public static void main(String[] args) {
List<String> res = new ArrayList<>();
String a = "dsfdsf";
printAllSub(a,res);
for (String re : res) {
System.out.println(re);
}
}
private static void printAllSub(String a, List<String> res) {
char[] sChars = a.toCharArray();
process(sChars,0,res,"");
}
private static void process(char[] cStr, int index, List<String> res, String path) {
if (index==cStr.length){
res.add(path);//加完以后直接返回
return;
}
process(cStr,index+1,res,path);//不要这个字符串
process(cStr,index+1,res,path+cStr[index]);//要这个字符串
}