思路一(bad idea)找出所有的排列,最后用set去重
public class Solution {
public String[] permutation(String s) {
// “abc”举个例子
// 第一个字符可以是 a,b,c
// 假设第一个是a,后边的可以是[b,c],[c,b]
// 然后将第一个字符 和 后面的拼接即可[a,b,c],[a,c,b]
if (s.length() == 1) {
return new String[]{s};
}
LinkedList<String> res = new LinkedList<>();// 结果list
// 如果s至少有两个字符
// 遍历,结果中,第一个字符是s的第i个字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 除去第i个字符,剩下的,得到所有的组合
String[] tmp = permutation(s.substring(0, i) + s.substring(i + 1, s.length()));
// 将第i个字符,放到第一个位置
for (String str : tmp) {
res.add(c + str);
}
}
// 用set去重
HashSet<String> set = new HashSet<>();
for (String str : res) {
set.add(str);
}
String[] resArr = new String[set.size()];
return set.toArray(resArr);
}
}
好的思路,搜索回溯,剪枝。
搜索回溯,剪枝,好解法
public class Solution {
LinkedList<String> list = new LinkedList<>();
char[] c;
public String[] permutation(String s) {
// 搜索回溯,剪枝
if (s.length() == 0) {
return new String[0];
}
c = s.toCharArray();
dfs(0);
return list.toArray(new String[list.size()]);
}
public void dfs(int x) {
if (x == c.length - 1) {
list.add(String.valueOf(c));
return;
}
HashSet<Character> set = new HashSet<>();
for (int i = x; i < c.length; i++) {
if (set.contains(c[i])) {
continue;
}
set.add(c[i]);
exchange(x, i);
dfs(x + 1);
exchange(x, i);
}
}
public void exchange(int i, int j) {
char tmp = c[i];
c[i] = c[j];
c[j] = tmp;
}
}