Permutation algorithm for array of integers in Java

前端 未结 9 2065
-上瘾入骨i
-上瘾入骨i 2020-11-29 12:56

I have a working example to generate all char permutations in a String as below:

static ArrayList permutations(String s) {
        if (s == nul         


        
9条回答
  •  悲&欢浪女
    2020-11-29 13:27

    Here is my solution (gist):

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.function.Consumer;
    import java.util.stream.Collectors;
    import java.util.stream.IntStream;
    
    /**
     * @author Karol Krol
     */
    public class Permutation {
    
        private Permutation() {
        }
    
        public static List> permutation(final int[] numbers) {
            final PermutationCollector permutationCollector = new PermutationCollector();
            permutation(new int[0], numbers, permutationCollector);
            return permutationCollector.getResult();
        }
    
        private static void permutation(int[] prefix, int[] array, final Consumer operation) {
            int length = array.length;
            if (length == 0) {
                operation.accept(prefix);
            } else {
                for (int i = 0; i < length; ++i) {
                    final int[] newPrefix = append(prefix, array[i]);
                    final int[] reducedArray = reduce(array, i);
                    permutation(newPrefix, reducedArray, operation);
                }
            }
        }
    
        private static int[] append(int[] array, int element) {
            int newLength = array.length + 1;
            array = Arrays.copyOf(array, newLength);
            array[newLength - 1] = element;
            return array;
        }
    
        private static int[] reduce(int[] array, int index) {
            final int newLength = array.length - 1;
            if (index == 0) {
                return Arrays.copyOfRange(array, 1, array.length);
            } else {
                final int[] dest = new int[newLength];
                System.arraycopy(array, 0, dest, 0, index);
                System.arraycopy(array, index + 1, dest, index, newLength - index);
                return dest;
            }
        }
    
        public static class PermutationCollector implements Consumer {
    
            private List> result = new ArrayList<>();
    
            @Override
            public void accept(int[] ints) {
                result.add(IntStream.of(ints).boxed().collect(Collectors.toList()));
            }
    
            public List> getResult() {
                return result;
            }
        }
    }
    

提交回复
热议问题