Code 地址:https://gitee.com/zhp1221/algorithm-exercise/blob/master/algorithm-journey/src/com/zhanghp/class038/Code01_Subsequences.java
public class Code01_Subsequences {
public static String[] convert(Set<String> set) {
String[] strArr = new String[set.size()];
int i = 0;
for (String it : set) {
strArr[i++] = it;
}
// 第2种方式
// String[] array = set.toArray(new String[set.size()]);
return strArr;
}
// ================================== 解法2 =======================================
public static String[] generatePermutation(String str) {
char[] charArray = str.toCharArray();
// 收集路径集合
Set<String> set = new HashSet<>();
/**
* =============带路径递归==============
*/
f(charArray, new char[charArray.length], 0, 0, set);
/**
* =============结果返回==============
*/
return convert(set);
}
/**
* 默认使用0开头,覆盖值
*
* @param charArr
* @param path
* @param cur 当前值的charArr的索引 --》 当前要处理的字符
* @param size 控制覆盖的位置 (包含,还是不包含的索引覆盖位置) & 添加路径字符数组的数量
* @param set
*/
public static void f(char[] charArr, char[] path, int cur, int size, Set<String> set) {
if (cur == charArr.length) {
set.add(String.valueOf(path, 0, size));
} else {
// 重置字符数组值 - 重复利用
// 根据size索引(是否添加上一层的字符) 来被 填充/覆盖 当前size索引值
path[size] = charArr[cur];
// 1.添加 - 节点 (size + 1代表添加了当前层的字符)
f(charArr, path, cur + 1, size + 1, set);
// 2.不添加 - 节点 (size 代表不添加了当前层的字符)
f(charArr, path, cur + 1, size, set);
}
}
}