题目描述:
给定一个有限无序的字母卡片集(均在a-z的范围内),相同的字母可重复出现,另有若干个单词,请你从中选择一个单词,使得用给定字母卡片集拼出的单词数尽可能多,并最终返回能拼成的单词个数。
测试用例:
输入:
2
eyaobjcbcbioay
2
boy bob
mkijnebhuygv
1
make
输出:
2
0
用例说明:
第一组:
对于"bob",给定字母卡片中有3个"b",2个"o",能拼成1个"bob";
对于"boy",给定字母卡片中有3个"b",2个"o",2个"y",能拼成2个"boy";
因此选择"boy",最多能拼成的单词个数为2
第二组:
对于"make",因为字母卡片中缺少字母"a",所以能拼成的单词个数为0。
代码如下:
import java.util.*;
public class TestDemo3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //n表示有几组数据
sc.nextLine();
//遍历每组数据
for(int i=0;i<n;i++){
String candidate = sc.nextLine(); //候选字符串
int wordCount = sc.nextInt(); //单词个数
sc.nextLine();
String word = sc.nextLine(); //空格隔开的多个单词
String[] wordArr= word.split(" "); //单词数组
//记录候选字符串中每个单词出现的个数
int[] arr = new int[26];
for(Character c : candidate.toCharArray()){
arr[c-'a']++;
}
int max = 0; //要输出的结果值
//遍历单词数组,拿到能构成每个单词的次数,最后选出最大的值
for(int j=0; j<wordArr.length; j++){
//找出每个单词对应的字符数量,放在map里
Map<Character,Integer> map = new HashMap<>();
for(Character c : wordArr[j].toCharArray()){
map.put(c,map.getOrDefault(c,0)+1);
}
int count = Integer.MAX_VALUE;
Set<Map.Entry<Character, Integer>> entries = map.entrySet();
for(Map.Entry<Character, Integer> entry : entries){
int key = entry.getKey();
int value = entry.getValue();
if(arr[key-'a'] == 0 ){
//如果单词中的某个单词在候选字符串中没有,则count直接赋值为0,结束本次循环
count = 0;
break;
}
int temp = arr[key-'a'] / value;
//找出能够组成该单词的个数,选较小的值
//比如候选单词中有3个'b'、2个'o'、2个'y',候选单词为boy,肯定是以最小的为准,能组成2个boy
if(temp < count){
count = temp;
}
}
//然后在候选单词中选出被组成次数最大的
if(count > max){
max = count;
}
}
//输出结果值
System.out.println(max);
}
}
}
测试结果如下: