题解 | 字符串的排列
字符串的排列
https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7
import java.util.*;
import java.util.stream.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return string字符串ArrayList
*/
public static ArrayList<String> Permutation(String str) {
Set<String> sets = new HashSet<>();
char[] marks = new char[str.length()]; // 标记已经添加过的
// LinkedList 用于缓存,也可以用栈
LinkedList<Character> list = new LinkedList<>();
combNum(sets, marks, list, str.toCharArray());
return new ArrayList<>(sets);
}
// 递归方式组合
public static void combNum(Set<String> sets, char[] marks
, LinkedList<Character> list, char[] arr) {
if (list.size() == arr.length) {
sets.add(list.stream().map(String::valueOf).collect(Collectors.joining()));
return;
}
for (int i = 0; i < arr.length; i++) {
if (marks[i] == 1) { // 排除已经添加的
continue;
}
list.add(arr[i]);
marks[i] = 1;
combNum(sets, marks, list, arr); // 递归继续寻找
list.removeLast(); // 移除已经参加过所有排列的数字
marks[i] = 0;
}
}
}
