对自己所了解的进行总结,可能还有更好的算法有待学习。
1.基于交换
<span style="font-size:18px;"> //全排列,基于交换
static void fun1(String s, int k) {
if (k == s.length()) {
System.out.println(s);
return;
}
char[] data = s.toCharArray();
for (int i = k; i < data.length; i++) {
swap(data, i, k);
fun1(new String(data), k + 1);
swap(data, i, k);//回溯
}
}
</span>
2.基于选择
<span style="font-size:18px;"> static int[] f;//计数数组,全排列不允许重复
//全排列,基于选择
static void fun2(String s) {
f = new int[s.length()];
fun3(s, "");
}
static void fun3(String s, String re) {
if (re.length() == s.length()) {
System.out.println(re);
return;
}
for (int i = 0; i < s.length(); i++) {
if (f[i] == 0) {
f[i] = 1;
fun3(s, re + s.charAt(i));
f[i] = 0;//回溯
}
}
}
</span>
1.输出字符串所有组合
输入abc,它的组合有a、b、c、ab、ac、bc、abc。
<span style="font-size:18px;"> //所有组合,基于选择
static void fun4(String s, String re, int k) {
if (k == s.length()) {
System.out.println(re);
return;
}
fun4(s, re + s.charAt(k), k + 1);//选第k位字符
fun4(s, re, k + 1);//不选第k位字符
}
</span>
2.输出字符串所有组合(2)
比如ab,则输出aa,ab,ba,bb。
和2.基于选择思路一样,只不过全排列不允许重复,所以用了计数数组f,这里去掉这个计数数组就好了。