问题:键盘输入一个仅有小写字母组成的字符串,输出以该串中任取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
原文:https://www.cnblogs.com/0591jb/p/14103129.html