您的位置:首页 > 其它

关于全排列的总结

2015-10-23 10:55 232 查看
对自己所了解的进行总结,可能还有更好的算法有待学习。

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,这里去掉这个计数数组就好了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  全排列