前缀条件全排列算法java实现 package algrithm;import com.google.common.collect.Lists;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.function.BiFunction;import java.util.function.Consumer;/
package algrithm; import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.BiFunction; import java.util.function.Consumer; /** * @author daimao Date: 2017/11/21 Time: 下午4:50 * @version $Id$ */ public class LexicographicPermutationWithRestrict1 { private static final int X2 = 2; private static final int X3 = 3; private static final int X4 = 4; private static final int X5 = 5; private static final int X6 = 6; public staticvoid perm(List list, BiFunction test, Consumer c) { if (list == null || list.isEmpty()) return; //X1: lk = k+1 for 0< void perm(int[] a, int[] l, int[] u, List list , BiFunction test, Consumer c) { int k = 0; int p = 0,q = 0; int n = list.size() - 1; int x = X2; while (true) { switch (x) { case X2: p = 0; q = l[0]; case X3: a[k] = q; //ak <- q if (!test.apply(a, k)) { //goto X5 x = X5; break; } else { if (k == n) { c.accept(a); //goto X6 x = X6; break; } } case X4: u[k] = p; l[p] = l[q]; k++; x = X2; break; case X5: p = q; q = l[p]; if (q != 0) { //goto X3 x = X3; break; } case X6: k--; if (k < 0) return; p = u[k]; q = a[k]; l[p] = q; //goto X5 x = X5; break; } } } private static boolean test(ArrayList a, int k) { System.out.println("test:" + a + ", k=" + k); return a.get(0) == 1; } public static void main(String[] args) { /** * 数组a[]是基于1开始的list的下标排序结果,即:list=[5,6,7] * 当 a[] = [1,3,2] 的时候对应 [list[1-1],list[3-1],list[2-1]] -> [5,7,6] * 因为算法的需要,a[]需要从1开始计数 */ ArrayList list = Lists.newArrayList( 5,6,7,8,9); perm(list,(a,k)-> list.get(a[0]-1).equals(5), a->{ for (int i = 0; i < a.length; i++) { System.out.print(list.get(a[i]-1)); } System.out.println(); }); } }