***剑指 Offer 38. 字符串的排列
感觉是比较难的一道题了,写一下思路以及运行流程。
举例 s = "abc"
1.首先将字符串s存入字符数组便于操作,进入dfs(0)
2.进入循环,交换‘a’和‘a’(相当于没变),进入dfs(1)
3.进入循环,交换‘b’和‘b’,进入dfs(2)
4.触发终止条件,把此时的字符串c转为String存入res
5.跳回dfs(1),交换‘b’和‘b’,进入下一层循环,x = 1, i = 2
6.交换‘b’和‘c’……将此时c转为String存入res……把‘b’和‘c’换回去。
7.一路回到dfs(0),进入dfs(0)的下一层循环,x = 0, i = 1;
8.交换‘a’和‘b’,进入dfs(1)
………………
class Solution { char[] c; List<String> res = new ArrayList<>(); public String[] permutation(String s) { //字符数组c,用来存放原字符串 c = s.toCharArray(); //dfs的参数是下标 dfs(0); return res.toArray(new String[res.size()]); } void dfs(int x){ //所有位置已经固定好,转为String存入res if(x == c.length - 1){ res.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]); //将字符 c[i] 和 c[x] 交换,即固定 c[i] 为当前位字符 swap(x, i); //开始固定第 x + 1 个字符; dfs(x + 1); //还原到交换之前 swap(x, i); } } //因为是全局变量所有可以这样交换 void swap(int a, int b){ char tmp = c[a]; c[a] = c[b]; c[b] = tmp; } }