import java.util.HashSet;
public class Test74 {
// 生成字符串的所有排列组合,使用递归和回溯的方法
public static String[] generatePermutation1(String str){
char[] s = str.toCharArray(); // 将输入的字符串转换为字符数组
HashSet<String> set = new HashSet<>(); // 使用HashSet存储不重复的排列组合
f1(s, 0, new StringBuilder(), set); // 调用递归函数f1开始生成排列
int len = set.size(); // 获取排列组合的数量
String[] ans = new String[len]; // 创建一个字符串数组用于存储结果
int i = 0;
for(String str1 : set){ // 遍历HashSet中的每个元素
ans[i++] = str1; // 将元素添加到结果数组中
}
return ans; // 返回结果数组
}
// 递归函数f1,用于生成排列组合
public static void f1(char[] s, int i, StringBuilder path, HashSet<String> set){
if(i == s.length){ // 如果已经处理完所有字符
set.add(path.toString()); // 将当前路径转换为字符串并添加到HashSet中
}else{
path.append(s[i]); // 将当前字符添加到路径中
f1(s, i + 1, path, set); // 继续处理下一个字符
path.deleteCharAt(path.length() - 1); // 回溯:删除最后一个字符
f1(s, i + 1, path, set); // 继续处理下一个字符(不包括当前字符)
}
}
// 生成字符串的所有排列组合,使用递归和回溯的方法,优化内存使用
public static String[] generatePermutation2(String str){
char[] s = str.toCharArray(); // 将输入的字符串转换为字符数组
HashSet<String> set = new HashSet<>(); // 使用HashSet存储不重复的排列组合
f2(s, 0, new char[s.length], 0, set); // 调用递归函数f2开始生成排列
int len = set.size(); // 获取排列组合的数量
String[] ans = new String[len]; // 创建一个字符串数组用于存储结果
int i = 0;
for(String str1 : set){ // 遍历HashSet中的每个元素
ans[i++] = str1; // 将元素添加到结果数组中
}
return ans; // 返回结果数组
}
// 递归函数f2,用于生成排列组合,优化内存使用
public static void f2(char[] s, int i, char[] path, int size, HashSet<String> set){
if(i == s.length){ // 如果已经处理完所有字符
set.add(String.valueOf(path, 0 , size)); // 将当前路径转换为字符串并添加到HashSet中
}else{
path[size] = s[i]; // 将当前字符添加到路径中
f2(s, i + 1, path, size + 1, set); // 继续处理下一个字符
f2(s, i + 1, path, size , set); // 继续处理下一个字符(不包括当前字符)
}
}
}
05-18
204
11-09
2588