题目
无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。
实例
输入:S = "qwe" 输出:["qwe", "qew", "wqe", "weq", "ewq", "eqw"]
思路与代码
典型回溯的方法,第i次迭代考虑字符串的第i个位置。
chars[i] 表示字符串S中的第i个字符
used[i] 表示字符chars[i]是否被使用
stringBuilder 用来表示当前已经形成的字符串
字符串链表result用来保存符合条件的字符串
在每一层的迭代中
- 查看字符是否满足条件,若满足,直接加入result链表
- 遍历当前未使用的字符
- 将字符标记为已使用
- 将字符加入到stringBuilder
- 下一层迭代
- 将字符从stringBuilder中删除
- 将字符标记为未使用
class Solution {
public String[] permutation(String S) {
int n = S.length();
char[] chars = S.toCharArray();
boolean[] used = new boolean[n];
LinkedList<String> result = new LinkedList<>();
dsf(chars, used, new StringBuilder(), result);
return result.toArray(new String[0]);
}
void dsf(char[] chars, boolean[] used, StringBuilder string, LinkedList<String> result){
if (string.length() == chars.length){
result.add(string.toString());
return;
}
for (int i = 0;i < chars.length; i++){
if (used[i]){
continue;
}
used[i] = true;
string.append(chars[i]);
dsf(chars, used, string, result);
string.deleteCharAt(string.length()-1);
used[i] = false;
}
}
}