题目
题目链接
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
限制:
1 <= s 的长度 <= 8
解题思路
全排列问题
回溯思想,考虑到如果输入字符串中包含重复元素,要求结果中不能有重复元素,所以这里用到了set集合去重。
为了方便理解,这里抽象成递归树。
代码
class Solution {
public String[] permutation(String s) {
if (s == null) {
return new String[]{};
}
char[] sChars = s.toCharArray();
int[] visited = new int[sChars.length];
StringBuilder sb = new StringBuilder();
Set<String> answer = new HashSet<>();
backstracking(sChars, visited, sb, answer);
String[] solve = solve(answer);
return solve;
}
public void backstracking(char[] sChars, int[] visited, StringBuilder sb, Set<String> answer) {
if (sb.length() == sChars.length) {
answer.add(sb.toString());
return;
}
for (int i = 0; i < sChars.length; i++) {
if (visited[i] == 1) {
continue;
}
visited[i] = 1;
sb.append(sChars[i]);
backstracking(sChars, visited, sb, answer);
visited[i] = 0;
sb.deleteCharAt(sb.length() - 1);
}
}
public String[] solve(Set<String> list) {
String[] answer = new String[list.size()];
int n = 0;
for (String s : list) {
answer[n] = s;
n++;
}
return answer;
}
}