private static boolean nextPermutate(char[] data) { int end = data.length - 1; int swapPoint1 = end, swapPoint2 = end; // the actual swap-point is swapPoint1 - 1 while (swapPoint1 > 0 && data[swapPoint1] <= data[swapPoint1 - 1])//从尾部向前找到第一个变小的数 swapPoint1--; if (swapPoint1 == 0) return false; else { while (swapPoint2 > 0 && data[swapPoint2] <= data[swapPoint1 - 1])//从尾部到swapPoint1找到第一个大于swapPoint1-1的位置 swapPoint2--; swap(data, swapPoint1 - 1, swapPoint2); reverse(data, swapPoint1, end);//用的是反转的操作,但其实起到的作用是从小到大排序。 return true; } } private static void swap(char[] data, int left, int right) { //调换顺序 char temp = data[left]; data[left] = data[right]; data[right] = temp; } private static void reverse(char[] data, int left, int right) { for (int i = left, j = right; i < j; i++, j--) swap(data, i, j); }
public static void Prim(char[] data) { Arrays.sort(data); do{ System.out.println(data); }while(nextPermutate(data)//data 下一个排列); }
以上代码是将全排列依次打印,也可以按需要改为接收全排列,代码如下:
public static void Prim(char[] data,char[][] q) {//传入一个二维数组q接收全排列 Arrays.sort(data); int i =0; do{ for(int j = 0; j< data.length; j++){ q[i][j] = data[j]; } i++; }while(nextPermutate(data)); }
因为要传入一个二维数组q用来接收全排列列表,所以要对其大小定义。
int len = s.length(); //s为传入的字符串 int l = factorial(len); //总排列数 char [][] q = new char [l][len]; Prim(s.toCharArray(),q);//将字符串s转为字符数组,获取其字典序全排列结果 public static int factorial(int n){ int sun = 1; for(int i=1; i<= n; i++){ sun = sun * i; } return sun; }
4.寻找谜底
public static void main(String[] args) { //接收输入 Scanner sc = new Scanner(System.in); int n = 0; if(sc.hasNext()){ n = sc.nextInt(); } String rv[] = new String[n]; for(int i = 0; i < n; i++){ rv[i] = sc.next(); } for(int i = 0; i < n; i++){ miDi(rv[i]); } } public static void miDi(String s){ //输出s 的谜底 int len = s.length(); int l = factorial(len); //总排列数 char [][] q = new char [l][len]; Prim(s.toCharArray(),q);//字典序全排列结果 int indexB = (indexA(q,s.toCharArray()) + len)%l; //谜底 System.out.println(q[indexB]); } public static int indexA(char[][]q, char[] d){ for(int i = 0; i < q.length; i++){ if(charCompare(q[i], d)){ return i; } } return -1; } public static boolean charCompare(char[] a, char[] b){ for(int j = 0; j < a.length; j++){ if (a[j] != b[j]){ return false; } } return true; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228941.html原文链接:https://javaforall.net
