//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末尾位置,承载了所有放入res
res.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=25
visit[str[i] - 'a'] = true;
swap(str, index, i);// i 往后所有的字符都可以来到index位置
g1(str, index + 1, res); // 改变了str ,然后走分支
swap(str, index, i); // 还原,交换位置就行。
}
}
}
}