题意:给定一个字符串str,和数字n ,你可以获取n个字母组成字符串s,求获得str需要的多少个s才能组成str(求s得最小值)
思路:先将字符串放进一个长度为26的数组中,得到每种字母的数量,用set记录字母的种类,然后判断n小于set直接输出-1,反之则新建一个二维数组a[set.size()][3]第一个数代表字母的数量,第二个数代表字母的种类,第三个数代表在s中该字母的数量,每次都以第一个数为标准排序,可得到最大的数,对最大数所对应的字母在s中再添加一个,并处理最大的数( a[set.size()-1][0]=a[set.size()-1][0]*(a[set.size()-1][2]-1)/a[set.size()-1][2])
AC代码:
import java.io.*;
import java.math.*;
import java.math.BigInteger;
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner (System.in);
String str=sc.next();
int n=sc.nextInt();
int arr[]=new int [26];
Set<Integer>set =new HashSet<>();
for(int i=0;i<str.length();i++) {
arr[(int)(str.charAt(i)-'a')]++;
set.add((int)(str.charAt(i)-'a'));
}
System.out.println(Arrays.toString(arr));
if(set.size()>n) {
System.out.println(-1);
return;
}
double a[][]=new double [set.size()][3];
int ii=0;
for(int i=0;i<26;i++) {
if(arr[i]!=0) {
a[ii][1]=i;
a[ii][0]=arr[i];
a[ii][2]=2;
ii++;
}
}
StringBuilder s=new StringBuilder("");
for(int i=0;i<set.size();i++) {
s.append((char)(a[i][1]+'a'));
}
n=n-set.size();
show(a);
while(n>0) {
a[set.size()-1][0]=a[set.size()-1][0]*(a[set.size()-1][2]-1)/a[set.size()-1][2];
s.append((char)(a[set.size()-1][1]+'a'));
a[set.size()-1][2]++;
show(a);
n--;
}
if(a[set.size()-1][0]%1==0)System.out.println((int)(a[set.size()-1][0]));
else System.out.println((int)(a[set.size()-1][0])+1);
System.out.println(s);
}
public static void show(double arr[][]) {
Arrays.sort(arr,new Comparator<double[]>(){
@Override
public int compare(double[] a1,double a2[]) {
if(a1[0]>a2[0]) {
return 1;
}else
return -1;
}
});
}
}