【题目】打印一个字符串的所有子序列,包括空字符串
public class PrintAllSubsquences {
private static void printAllSubsquences(String str){
char[] chs = str.toCharArray();
process(chs,0);
}
//节省空间
private static void process(char[] chs, int i){
if (i == chs.length){
System.out.println(String.valueOf(chs));
return;
}
//要当前的字符
process(chs, i+1);
char temp = chs[i];
//不要当前的字符
chs[i] = 0;
process(chs, i+1);
//还原字符
chs[i] = temp;
}
private static void printAllSubsquences2(String str){
char[] chs = str.toCharArray();
process(chs,0, new ArrayList<Character>());
}
private static void process(char[] chs, int i, List<Character> characters) {
if (i == chs.length){
printList(characters);
return;
}
List<Character> keepList = copyList(characters);
//要当前的字符
keepList.add(chs[i]);
process(chs,i+1,keepList);
//不要当前的字符
List<Character> noIncludeList = copyList(characters);
process(chs, i+1, noIncludeList);
}
public static void printList(List<Character> res) {
StringBuilder sb = new StringBuilder();
for (Character character : res) {
sb.append(character);
}
System.out.println(sb.toString());
}
public static List<Character> copyList(List<Character> list){
return new ArrayList<>(list);
}
public static void main(String[] args) {
String str = "abc";
printAllSubsquences(str);
}
}