尝试模型:
从左到右,只不过index表示第几个位置的字符。N叉树问题
从剩余的字符中选择一个没有出现过的字符
* 排列组合问题
*/
public class T27_Per_Com {
public static void main(String[] args) {
String str = "abc";
process(str.toCharArray(), 0, "");
}
public static void process(char[] chs, int index, String str){
if(index == chs.length) {
System.out.println(str + " ===");
return;
}
for(int i = 0 ; i < chs.length ; i++){
if(chs[i] != 0 ){
char temp = chs[i];
chs[i] = 0;
process(chs, index +1, str+ String.valueOf(temp));
chs[i] = temp;
}
}
}
}
解法2: 任意两个字符交换,
通过交换的方式,避免上面for循环的多余遍历。
str承载了之前做的选择
组合就是去掉注释后的代码
意思是aabb这样的组合,有重复的,要去重,那就看该位置有没有做过此元素的遍历。
就是避免交换的字符已经试过了。
tips: 可以先permutation,然后再去重,常数复杂度高
加上注释,提前杀死不可能走的路径,分支定界。