1. 程式人生 > 實用技巧 >用JAVA解決ACM可重複排列問題

用JAVA解決ACM可重複排列問題

問題:鍵盤輸入一個僅有小寫字母組成的字串,輸出以該串中任取M個字母所有排列及排列總數(輸入不需要判錯)。

問題的難點是:對字串要先排序,以及有重複字元。

package main;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;

import static java.util.Collections.*;

public class Main{
    public static void main(String[] args){
        //int[] arr = new int[]{1, 3, 2, 5, 4, 6, 7, 1, 4, 9};
        int[] arr = new int[]{1, 3, 2, 1};
        IntStream stream = Arrays.stream(arr);
        Stream<Integer> integerStream = stream.boxed();
        Integer[] integers = integerStream.toArray(Integer[]::new);
        ArrayList<Integer> arr2 = new ArrayList<>(Arrays.asList(integers));

        sort(arr2);
        do{
            for (int i = 0; i<arr2.size(); System.out.print(arr2.get(i++)));
            System.out.println();
        }while (new Main().next_permutation(arr2, 0, arr2.size()));
    }


    public boolean next_permutation(ArrayList<Integer> arr, int begin, int end){
        if (begin == end || begin + 1 == end) {
            return false;
        }
        for (int i=end-1; i!=begin;){
            int j = i--;
            if (!(arr.get(i) < arr.get(j))){
                continue;
            }

            int k = end;
            while (!(arr.get(i) < arr.get(--k)));
            swap(arr, i, k);
            reverse(arr.subList(j,end));
            return true;
        }
        reverse(arr.subList(begin, end));
        return false;
    }
}

來源:唐山SEO