Sword38——字符串的排列
方法1——回溯
- 思路:依次确定每一位可填入的字符,再确定第二位可填入的字符,依次确定下一位可填入的字符
- 特殊情况与临界分析:无
- 终止条件:当最后一位字符确定时,即代表此次结果完成
- 步骤:
- 定义全局结果List
- 定义全局字符数组
- 初始化字符数组,即字符串转换为字符数组
- 展开递归
- 返回结果,将List转换为String数组
- 递归方法
- 参数:当前正在确定的字符位置下标数
- 终止条件:当到达最后一个位置
- 使用HashSet记录已经出现过的字符
- for循环
- 参数:从当前idx开始,当i小于字符数组长度
- 如果HashSet中已包含当前字符,则跳过当前下标对应的操作
- 无重复字符时,则进行操作
- 将当前字符加入HashSet
- 将当前字符固定在字符数组的当前位置
- 对下一位字符进行操作
- 撤销固定操作,避免影响向上回溯的结果
List<String> res = new LinkedList<>();
char[] c;
public String[] permutation(String s) {
c = s.toCharArray();
dfs(0);
return res.toArray(new String[res.size()]);
}
private void dfs(int idx) {
if (idx == c.length - 1) {
res.add(String.valueOf(c));
return;
}
Set<Character> occ = new HashSet<>();
for (int i = idx; i < c.length; i++) {
if (occ.contains(c[i])) {
continue;
}
occ.add(c[i]);
swap(i, idx);
dfs(idx + 1);
swap(i, idx);
}
}
private void swap(int i, int j) {
char tmp = c[i];
c[i] = c[j];
c[j] = tmp;
}