1. 题目
2. 思路
(1) 递归
- 利用ArrayList存储还未加入字符串的字符,遍历ArrayList,将每个字符都放在当前位置上,并递归其他字符。
(2) 递归优化
- 利用交换可以不用新建ArrayList。
- 将字符串看作两部分,左边是排好序的,右边是未排序的,将右边未排序的字符依次与当前字符进行交换,然后递归处理下一个位置。
- 回溯时需要交换回来,以便与下一个字符交换。
3. 代码
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Test {
public static void main(String[] args) {
}
}
class Solution {
private Set<String> set = new HashSet<>();
public String[] permutation(String s) {
List<Character> ch = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
ch.add(s.charAt(i));
}
recur(ch, "");
String[] res = new String[set.size()];
int index = 0;
for (String str : set) {
res[index++] = str;
}
return res;
}
private void recur(List<Character> ch, String str) {
if (ch.size() == 0) {
set.add(str);
}
for (int i = 0; i < ch.size(); i++) {
List<Character> list = new ArrayList<>();
for (int j = 0; j < i; j++) {
list.add(ch.get(j));
}
for (int j = i + 1; j < ch.size(); j++) {
list.add(ch.get(j));
}
recur(list, str + ch.get(i));
}
}
}
class Solution1 {
private List<String> list = new ArrayList<>();
private char[] chars;
public String[] permutation(String s) {
chars = s.toCharArray();
recur(0);
return list.toArray(new String[list.size()]);
}
private void recur(int index) {
if (index == chars.length - 1) {
list.add(String.valueOf(chars));
return;
}
Set<Character> set = new HashSet<>();
for (int i = index; i < chars.length; i++) {
if (!set.add(chars[i])) {
continue;
}
swap(index, i);
recur(index + 1);
swap(index, i);
}
}
private void swap(int a, int b) {
char temp = chars[a];
chars[a] = chars[b];
chars[b] = temp;
}
}