//str[i..]范围上,所有字符,都可以在i位置上,后续都去尝试//str[0..i-1]范围上,是之前做的选择//请把所有的字符串形成的全排列,加入到res里去//str 承载了已经选择的public static void g1(char[] str, int index, List<String> res){if (index == str.length) { // basecase 到了str末尾位置,承载了所有放入resres.add(String.valueOf(str));} else {boolean [ ] visit =new boolean[26]; //某个字符试过还是没试过 visit[0 1..25]for (int i = index; i < str.length; i++) {// 只有没试过才试,分支限界,走已经试过的这条路就给杀死if(!visit[str[i] - 'a']){ // a -a =0 b-a =1 z-a=25visit[str[i] - 'a'] = true;swap(str, index, i);// i 往后所有的字符都可以来到index位置g1(str, index + 1, res); // 改变了str ,然后走分支swap(str, index, i); // 还原,交换位置就行。}}}}
