package class17; import java.util.ArrayList; import java.util.HashSet; import java.util.List; public class Code03_PrintAllSubsquences { // s -> "abc" -> public static List subs(String s) { char[] str = s.toCharArray(); String path = ""; List ans = new ArrayList<>(); process1(str, 0, ans, path); return ans; } // str 固定参数 // 来到了str[index]字符,index是位置 // str[0..index-1]已经走过了!之前的决定,都在path上 // 之前的决定已经不能改变了,就是path // str[index....]还能决定,之前已经确定,而后面还能自由选择的话, // 把所有生成的子序列,放入到ans里去 public static void process1(char[] str, int index, List ans, String path) { if (index == str.length) { ans.add(path); return; } // 没有要index位置的字符 process1(str, index + 1, ans, path); // 要了index位置的字符 process1(str, index + 1, ans, path + String.valueOf(str[index])); } public static List subsNoRepeat(String s) { char[] str = s.toCharArray(); String path = ""; HashSet set = new HashSet<>(); process2(str, 0, set, path); List ans = new ArrayList<>(); for (String cur : set) { ans.add(cur); } return ans; } public static void process2(char[] str, int index, HashSet set, String path) { if (index == str.length) { set.add(path); return; } String no = path; process2(str, index + 1, set, no); String yes = path + String.valueOf(str[index]); process2(str, index + 1, set, yes); } public static void main(String[] args) { String test = "acccc"; List ans1 = subs(test); List ans2 = subsNoRepeat(test); for (String str : ans1) { System.out.println(str); } System.out.println("================="); for (String str : ans2) { System.out.println(str); } System.out.println("================="); } }