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