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