# 常见算法之全排列 全组合

<span style="font-size:14px;">public static void permutation1(final String str, String buffer){
if (str.length() == buffer.length()){
System.out.println((num++) + ":" + buffer);
return;
}

for (int i = 0; i < str.length(); i++){
if (buffer.indexOf((int)str.charAt(i)) < 0){
permutation1(str, buffer + str.charAt(i));
}
}
}</span>

<span style="font-size:14px;">public static void permutation2(final char[][] array, String result, int len){

if (result.length() == len){
System.out.println(result);
}else{
for (int i = 0; i < len; i++){
if (array[i][1] == 0){
array[i][1] = 1;
permutation2(array, result + array[i][0], len);
array[i][1] = 0;
}
}
}
}</span>

<span style="font-size:14px;">public static void main(String[] args) {
String str = "abcd";
char[][] array = new char[str.length()][2];
for (int i = 0; i < str.length(); i++){
array[i][0] = str.charAt(i);
array[i][1] = 0;
}
String result = new String();
permutation2(array, result, str.length());
}</span>

p = {r1,r2,r3,r4…} , 设 pn = p – {rn}

perm(p) = r1perm(p1) + r2perm(p2) + r3perm(p3) + ….

<span style="font-size:14px;">public static void swap(char[] array, int from, int to){
char temp = array[from];
array[from] = array[to];
array[to] = temp;
}

public static void permutation3(char[] array, int n){
if (n == array.length){
System.out.println(new String(array));
}else {
for (int i = n; i < array.length; i++){
swap(array, i, n);
permutation3(array, n + 1);
swap(array, i, n);
}
}
}</span>

<span style="font-size:14px;">public static void reversal(char array[], int from, int to){
while (from < to){
swap(array, from++, to–);
}
}

public static boolean hasNext(char[] array){
if (array.length == 0 || array == null){
return false;
}

int endIndex = array.length – 1;
int q = endIndex – 1;
int p = endIndex;
while (q >= 0){
if (array[q] < array[q + 1]){
while (array[q] > array[p]){
p–;
}
swap(array, p, q);
reversal(array, q + 1, array.length – 1);
return true;
}
q–;
}
reversal(array, 0, array.length – 1);
return false;

}

public static void main(String[] args) {
char[] array = "abc".toCharArray();
do {
System.out.println(array);
} while (hasNext(array));
}</span>

{} => 000
{a} => 001 {b} => 010

<span style="font-size:14px;">public static void assembly(char[] array){
int num; //全组合的组数
num = 1 << array.length;
for (int i = 0; i < num; i++){
StringBuffer buffer = new StringBuffer();
for (int j = 0; j < array.length; j++){
if ((i & (1 << j)) > 0){
buffer.append(array[j]);
}
}
System.out.println(buffer);
}
}</span>

1. 本站所有资源来源于用户上传和网络，如有侵权请邮件联系站长！
2. 分享目的仅供大家学习和交流，您必须在下载后24小时内删除！
3. 不得使用于非法商业用途，不得违反国家法律。否则后果自负！
4. 本站提供的源码、模板、插件等等其他资源，都不包含技术服务请大家谅解！
5. 如有链接无法下载、失效或广告，请联系管理员处理！
6. 本站资源售价只是赞助，收取费用仅维持本站的日常运营所需！
7. 本站源码并不保证全部能正常使用，仅供有技术基础的人学习研究，请谨慎下载
8. 如遇到加密压缩包，请使用WINRAR解压,如遇到无法解压的请联系管理员！