无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。
示例1:
输入:S = "qwe"
输出:["qwe", "qew", "wqe", "weq", "ewq", "eqw"]
示例2:
输入:S = "ab"
输出:["ab", "ba"]
提示:
字符都是英文字母。
字符串长度在[1, 9]之间。
方法1:回溯
List<String> list = new ArrayList<>();
public String[] permutation(String S) {
dfs(S, new StringBuilder());
String[] res = new String[list.size()];
return list.toArray(res);
}
private void dfs(String S, StringBuilder cur) {
if (cur.length() == S.length()) {
list.add(cur.toString());
return;
}
for (int i = 0; i < S.length(); i++) {
if (cur.toString().contains(S.charAt(i) + "")) continue;
cur.append(S.charAt(i));
dfs(S, cur);
cur.deleteCharAt(cur.length() - 1);
}
}
方法2:交换
List<String> list = new ArrayList<>();
public String[] permutation(String S) {
char[] chas = S.toCharArray();
dfs(chas,0);
String[] res = new String[list.size()];
return list.toArray(res);
}
private void dfs(char[] chas, int idx) {
if (idx == chas.length - 1) {
list.add(String.valueOf(chas));
return;
}
for (int i = idx; i < chas.length; i++) {
swap(chas, i, idx);
dfs(chas, idx + 1);
swap(chas, i, idx);
}
}
private void swap(char[] chas, int i, int j) {
char t = chas[i];
chas[i] = chas[j];
chas[j] = t;
}