首页 > 编程语言 > 详细

用JAVA解决ACM可重复排列问题

时间:2020-12-08 16:48:17      阅读:27      评论:0      收藏:0      [点我收藏+]

问题:键盘输入一个仅有小写字母组成的字符串,输出以该串中任取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

用JAVA解决ACM可重复排列问题

原文:https://www.cnblogs.com/0591jb/p/14103129.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!