万能字符单词拼写 - 华为OD统一考试(D卷)
OD统一考试(D卷)
分值: 100分
题解: Java / Python / C++
题目描述
有一个字符串数组 words 和一个字符串 chars。假如可以用 chars 中的字母拼写出 words 中的某个"单词"(字符串),那么我们就认为你掌握了这个单词。
words 的字符仅由 a-z 英文小写宁母组成,例如“abc”。
chars 由 a- z 英文小写字母和“?”组成,其中英文“?"表示万能字符,能够在拼写时当作任意一个英文字母。例如“?"可以当作"a"等字母。
注意: 每次拼写时,chars 中的每个字母和万能字符都只能使用一次。
输出词汇表 words 中你掌握的所有单词的个数。没有掌握任何单词,则输出0。
输入描述
第一行: 输入数组 words 的个数,记作N。
第二行~第N+1行: 依次输入数组words的每个字符串元素。
第N+2行: 输入字符串 chars
输出描述
输出一个整数,表示词汇表 words 中你掌握的单词个数
备注
1 <= words.length <= 100
1 <= words[i].length, chars.length <= 100
所有字符串中都仅包含小写英文字母、英文问号
示例1
输入
4
cat
bt
hat
tree
atach??
输出
3
说明:可以掌握的单词 "cat”、“bt"和"hat"。
示例2
输入
3
hello
world
cloud
welldonehohneyr
输出:
2
说明:可以掌握的单词 "hello”、“world"。
示例3
输入
3
apple
car
window
welldoneapplec?
输出:
2
说明:可以掌握的单词 "apple”、“car"。
题解
模拟题
通过对单词的每个字符个数进行统计,然后按照题意要求进行模拟,拼写时单词的每个字符都能拼出来则单词可以掌握。
Java
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @author code5bug
*/
public class Main {
// 统计字符串各字符个数
public static int[] counter(String s) {
// cnt[26] 表示 '?' 号的个数
int[] cnt = new int[27];
for (char c : s.toCharArray()) {
if (c == '?') cnt[26]++;
else cnt[c - 'a']++;
}
return cnt;
}
// 检测 source 字符个数能否由 target 拼接而来(target[26] 表示 '?' 的个数)
public static boolean canSpell(int[] source, int[] target) {
int t = target[26]; // '?' 号个数
for (int i = 0; i < 26 && t >= 0; i++) {
if (source[i] <= target[i]) continue;
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
华为OD机考(C卷、D卷)算法题库(绝对都是原题),帮助你上岸华为(已经不少小伙伴成功上岸)。提供Java、Python、C++ 三种语言的解法。每篇文章都有详细的解题步骤、代码注释详细及相关知识点的练习题。有问题,随时解答。 从 2024年4月24开始,考的都是华为OD统一考试(D卷),据已经参加D卷考试的同学反馈D卷和C卷是一样的,如果发现新题会及时更新。