当前位置: 代码迷 >> J2SE >> 给定一字符数组,求数组中字符组成的所有排列?该如何解决
  详细解决方案

给定一字符数组,求数组中字符组成的所有排列?该如何解决

热度:278   发布时间:2016-04-24 18:04:12.0
给定一字符数组,求数组中字符组成的所有排列?
如:
Java code
char[] c = {'a','b','c','d','e','f'};

得到这些字符组合的所有排列情况.

abcdef
abcdfe
abcedf
abcefd
abcfde
abcfed
...
...

------解决方案--------------------
Java code
import java.util.ArrayList;import java.util.List;public class Test {    public static void main(String[] args) {        char[] c = {'a','b','c','d','e','f'};                //list保存找到的字符串        List<String> list = new ArrayList<String>();        //查找满足条件的字符串,并存入list        for(int i=0; i<c.length; i++) {            for(int j=0; j<c.length; j++) {                if(i == j)                    continue;                for(int k=0; k<c.length; k++) {                    if(i == k || j == k)                        continue;                    for(int l=0; l<c.length; l++) {                        if(i == l || j == l || k == l)                            continue;                        for(int m=0; m<c.length; m++) {                            if(i == m || j == m || k == m || l == m)                                continue;                            for(int n=0; n<c.length; n++) {                                if(i == n || j == n || k == n || l == n || m == n)                                    continue;                                StringBuffer sb = new StringBuffer();                                sb.append(c[i]);                                sb.append(c[j]);                                sb.append(c[k]);                                sb.append(c[l]);                                sb.append(c[m]);                                sb.append(c[n]);                                list.add(sb.toString());                            }                        }                    }                }            }        }                //打印字符串的个数,换行打印字符串,每行10个        System.out.println(list.size());        int count = 0;        for(int i=0; i<list.size(); i++) {            System.out.print(list.get(i));            count ++;            if(count % 10 != 0)//如果没够10个,行尾加","号                System.out.print(",");            else//10个换行                System.out.println();        }    }}
------解决方案--------------------
Java code
public static void main(String[] args) {    char[] origin = { 'a', 'b', 'c', 'd', 'e', 'f' };    int length = origin.length;    int[] tmp = new int[length];    char[] res = new char[length];    byte[] check = new byte[(length + 7) / 8];    int index = 0, level = 0;    while (true) {        if (index >= 0 && index < length && level >= 0 && level < length) {            if ((check[index / 8] & (1 << index % 8)) == 0) {                tmp[level] = index;                res[level] = origin[index];                check[index / 8] |= (1 << index % 8);                level++;                index = 0;                continue;            } else {                index++;                continue;            }        }        if (level >= length) {            System.out.println(new String(res));            level = length - 1;            index = tmp[level];            check[index / 8] &= ~(1 << index % 8);            index++;            continue;        }        if (index >= length) {            level--;            if (level < 0)                break;            index = tmp[level];            check[index / 8] &= ~(1 << index % 8);            index++;            continue;        }    }}
------解决方案--------------------
Java code
public static void main(String[] args) {    char[] origin = { 'a', 'b', 'c', 'd', 'e', 'f' };    int length = origin.length;    int[] tmp = new int[length];    char[] res = new char[length];    boolean[] check = new boolean[length];    int index = 0, level = 0;    while (true) {        if (index >= 0 && index < length && level >= 0 && level < length) {            if (!check[index]) {                tmp[level] = index;                res[level] = origin[index];                check[index] = true;                level++;                index = 0;            } else {                index++;            }        } else if (level >= length) {            System.out.println(new String(res));            level = length - 1;            index = tmp[level];            check[index] = false;            index++;        } else if (index >= length) {            level--;            if (level < 0)                break;            index = tmp[level];            check[index] = false;            index++;        } else {            break;        }    }}
  相关解决方案