【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 单词大师(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

单词大师(100分)

🌍 评测功能需要 订阅专栏 后私信联系清隆解锁~

🍓OJ题目截图

在这里插入图片描述

文章目录

    • 📎在线评测链接
    • 🍓OJ题目截图
    • 🥮 单词大师
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 样例输入
      • 样例输出
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码

🥮 单词大师

问题描述

给定一个字符串数组 w o r d s words words 和一个字符串 c h a r s chars chars。如果可以用 c h a r s chars chars 中的字母拼写出 w o r d s words words 中的某个单词,则认为你掌握了这个单词。 w o r d s words words 中的字符仅由小写字母 a − z a-z az 和特殊字符 ? 组成,其中 ? 可以代表任意一个字母。

注意:拼写时, c h a r s chars chars 中的每个字母只能使用一次,? 也只能使用一次。

请输出你能够拼写出的 w o r d s words words 中的单词数量。如果一个也拼写不出,则输出 0 0 0

输入格式

第一行输入一个整数 N N N,表示数组 w o r d s words words 的长度。

接下来 N N N 行,每行输入一个字符串,表示 w o r d s words words 中的一个单词。

最后一行输入一个字符串 c h a r s chars chars

其中, 1 ≤ N ≤ 100 1 \le N \le 100 1N100 1 ≤ w o r d [ i ] . l e n g t h , c h a r s . l e n g t h ≤ 100 1 \le word[i].length, chars.length \le 100 1word[i].length,chars.length100

输出格式

输出一个整数,表示你能够拼写出的 w o r d s words words 中的单词数量。

样例输入

4
cat
bt
hat
tree
atach??

样例输出

3

样例输入

3
hello
world
cloud
welldonehoneyr

样例输出

2

样例输入

3
apple
car
window
welldoneapplec?

样例输出

2

数据范围

  • 1 ≤ N ≤ 100 1 \le N \le 100 1N100
  • 1 ≤ w o r d [ i ] . l e n g t h , c h a r s . l e n g t h ≤ 100 1 \le word[i].length, chars.length \le 100 1word[i].length,chars.length100

题解

这道题可以通过统计字符频率的方式来判断是否能拼写出每个单词。

  1. 首先统计 c h a r s chars chars 中每个字母出现的次数,以及 ? 出现的次数。
  2. 对于每个单词 w o r d word word,统计其中每个字母出现的次数。
  3. 遍历单词的每个字母,如果该字母在 c h a r s chars chars 中出现的次数大于等于在 w o r d word word 中出现的次数,则可以拼写;否则,如果 ? 的数量大于等于不足的字母数,也可以拼写;否则,无法拼写该单词。
  4. 如果能拼写该单词,则答案加一。
  5. 最后输出答案即可。

时间复杂度为 O ( N L ) O(NL) O(NL),其中 N N N 为单词数量, L L L 为单词的平均长度。空间复杂度为 O ( 1 ) O(1) O(1),因为只需要常数级的额外空间。

参考代码

  • Python
n = int(input())
words = []
for _ in range(n):
    words.append(input())
chars = input()

def can_spell(word, chars):
    cnt_word = [0] * 26
    for c in word:
        cnt_word[ord(c) - ord('a')] += 1
    
    cnt_chars = [0] * 26
    wild = 0
    for c in chars:
        if c == '?':
            wild += 1
        else:
            cnt_chars[ord(c) - ord('a')] += 1
    
    for i in range(26):
        if cnt_word[i] > cnt_chars[i]:
            if wild >= cnt_word[i] - cnt_chars[i]:
                wild -= cnt_word[i] - cnt_chars[i]
            else:
                return False
    
    return True

ans = 0
for word in words:
    if can_spell(word, chars):
        ans += 1

print(ans)
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String[] words = new String[n];
        for (int i = 0; i < n; i++) {
            words[i] = sc.next();
        }
        String chars = sc.next();
        
        int ans = 0;
        for (String word : words) {
            if (canSpell(word, chars)) {
                ans++;
            }
        }
        
        System.out.println(ans);
    }
    
    private static boolean canSpell(String word, String chars) {
        int[] cntWord = new int[26];
        for (char c : word.toCharArray()) {
            cntWord[c - 'a']++;
        }
        
        int[] cntChars = new int[26];
        int wild = 0;
        for (char c : chars.toCharArray()) {
            if (c == '?') {
                wild++;
            } else {
                cntChars[c - 'a']++;
            }
        }
        
        for (int i = 0; i < 26; i++) {
            if (cntWord[i] > cntChars[i]) {
                if (wild >= cntWord[i] - cntChars[i]) {
                    wild -= cntWord[i] - cntChars[i];
                } else {
                    return false;
                }
            }
        }
        
        return true;
    }
}
  • Cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;

bool canSpell(string word, string chars) {
    vector<int> cntWord(26, 0);
    for (char c : word) {
        cntWord[c - 'a']++;
    }
    
    vector<int> cntChars(26, 0);
    int wild = 0;
    for (char c : chars) {
        if (c == '?') {
            wild++;
        } else {
            cntChars[c - 'a']++;
        }
    }
    
    for (int i = 0; i < 26; i++) {
        if (cntWord[i] > cntChars[i]) {
            if (wild >= cntWord[i] - cntChars[i]) {
                wild -= cntWord[i] - cntChars[i];
            } else {
                return false;
            }
        }
    }
    
    return true;
}

int main() {
    int n;
    cin >> n;
    vector<string> words(n);
    for (int i = 0; i < n; i++) {
        cin >> words[i];
    }
    string chars;
    cin >> chars;
    
    int ans = 0;
    for (string word : words) {
        if (canSpell(word, chars)) {
            ans++;
        }
    }
    
    cout << ans << endl;
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/720703.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【每天学会一个渗透测试工具】Nessus安装及使用指南

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 其他扫描工具&#xff1a; AWVS和Xray&#xff1a;应用漏洞扫描工具 fscan&#xff1a;虽然能扫主机&#xff0c;但比较老了…

心跳机制讲解及实例

什么是心跳机制 心跳机制出现在tcp长连接中&#xff0c;客户端和服务器之见定时发送一种特殊的数据包通知对方还在线&#xff0c;以确保tcp链接地可靠性&#xff0c;有可能tcp链接由于某些原因(列入网线被拔了&#xff0c;突然断电)导致客户端断了&#xff0c;但是服务器不知道…

PDM 测试

文章目录 硬件拓扑AP 生成 PDM输出数据路径AP 输入时域数据频域数据逻辑分析与抓包硬件拓扑 如果使用 AP 需要注意公地 AP 生成 PDM输出 AP 的 output 选择 PDM,MCU 提供 Bit clock,AP 生成 PDM 数据,AP 配置如下 数据路径 AP sin data -> PDM -> codec -> RA…

从11个视角看全球Rust程序员4/4:深度解读JetBrains最新报告

讲动人的故事,写懂人的代码 8 Rust程序员最喜欢用什么工具调试程序? 用println!或dbg!宏来调试一下 2022年:55%2023年:55%在IDE里玩玩UI调试 2022年:27%2023年:29%在控制台里调试调试 2022年:11%2023年:10%不调试,任性 2022年:5%2023年:6%有其他奇思妙想 2022年:1%…

软考阅卷将完成?!软考成绩有望六月底公布!

2024上半年软考考试已于5月25日-28日举行&#xff0c;考完试后大家最关心的事情莫过于查分了。 一、最新消息 1、不同地区在报名时对成绩公布的时间有所预示&#xff0c;但并没有一个统一的日期举个例子&#xff0c;江苏考区预计在6月下旬公布成绩&#xff0c;而黑龙江考区则预…

自注意力与卷积高效融合!多SOTA、兼顾低成本与高性能

在自注意力机制中&#xff0c;模型计算输入序列中不同位置的相关性得分&#xff0c;以生成连接权重&#xff0c;从而关注序列中的重要部分。而卷积通过滑动窗口的方式&#xff0c;在输入上应用相同权重矩阵来提取局部特征。 如果将以上两者结合&#xff0c;就可以同时利用自注…

爱死了,4款逆天IOS App推荐!

河马喝水提醒 「河马喝水提醒」是一款生活小助手应用&#xff0c;旨在帮助用户建立并维持定时喝水的良好习惯。该应用不仅是一个提醒闹钟&#xff0c;更是健康生活的贴心伙伴。它每天定时推送提醒&#xff0c;帮助用户在繁忙的日常中不忘补充水分。此外&#xff0c;该应用还提供…

软件性能测试之负载测试、压力测试详情介绍

负载测试和压力测试是软件性能测试中的两个重要概念&#xff0c;它们在保证软件质量和性能方面起到至关重要的作用&#xff0c;本文将从多个角度详细介绍这两种测试类型。 一、软件负载测试   负载测试是在特定条件下对软件系统进行长时间运行和大数据量处理的测试&#xff…

电能表厂家的研发能力是实力的体现

电能表厂家的研发能力无疑是其整体实力的核心体现。一个拥有强大研发能力的电能表厂家&#xff0c;不仅能够持续推出具有竞争力的新产品&#xff0c;满足市场需求&#xff0c;还能引领行业发展&#xff0c;塑造企业品牌形象。 一、研发能力对电能表厂家的重要性 研发能力是电…

如何预防最新的Mallox变种hmallox勒索病毒感染您的计算机?

一、引言 近年来&#xff0c;网络安全问题日益严重&#xff0c;勒索病毒成为了其中的一大威胁。其中&#xff0c;.hmallox勒索病毒作为Malox勒索软件家族的新变种&#xff0c;凭借其高度的攻击性和隐蔽性&#xff0c;给全球用户的数据安全带来了严重威胁。本文将深入分析.hmal…

部署yum仓库

目录 安装软件包 yum 配置文件 缓存功能操作步骤 创建并配置本地仓库文件 yum相关命令 yum install __ yum repolist yum list __ yum info __ yum search __ yum whatprovides __ yum remove __ yum -y update __ yum history yum grouplist yum groupinstall…

【C语言】回调函数 和 部分库函数的用法以及模拟实现

一、回调函数&#xff1a; 1、定义&#xff1a; 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;我们就说这是回调函数。 2、qsort的模拟实现…

PHP基础语法【上】

文章目录 一、环境安装二、代码应该写在哪里&#xff1f;三、什么是错误&#xff1f;四、变量无需声明变量变量命名规则变量的作用域可变变量 五、常量常量的定义常量的特性 六、数据类型NULL 空值Boolean 布尔类型Integer 整型Float 浮点型String 字符串Array 数组Object 对象…

有效招聘营销策略的六个组成部分

任何想吸引更多人购买其产品的公司都必须投资于市场营销。然而&#xff0c;当涉及到让更多的人了解公司的工作时&#xff0c;许多有效的营销活动可能不是招聘团队的首要考虑因素。为了超越招聘委员会上的“发布祈祷”策略&#xff0c;有必要包括有效招聘营销策略的所有组成部分…

Redis 6.0新特性详解

Redis 6.0新特性主要有3个&#xff1a;多线程、Client Side Cache、Acls。下面详细说明一下。 1.多线程 redis 6.0 提供了多线程的支持&#xff0c;redis 6 以前的版本&#xff0c;严格来说也是多线程&#xff0c;只不过执行用户命令的请求时单线程模型&#xff0c;还有一些线…

【Axure高保真原型】动态统计中继器表格项目数

今天和大家分享动态统计中继器表格项目数的原型模板&#xff0c;具体包括以下功能&#xff1a; 表格下方可以自动根据表格内容统计表格的总项目数、启用和禁用数、选中和未选中数 我们可以点击开发切换启用和禁用 点击多选按钮&#xff0c;选中或取消选中对应行内容 选中后可…

跨境电商源码支持,多国语言与货币切换功能全解析

一、背景介绍 跨境电商的兴起&#xff0c;使得供货商和代理商们面临着一个全新的挑战&#xff1a;如何管理跨国交易和多语言 的销售平台。为了解决这一问题&#xff0c;跨境电商源码应运而生。本文将全面解析供货商和代理商后 台所具备的跨境电商源码支持功能&…

环境搭建---nginx

nginx离线安装 下载地址&#xff1a;https://nginx.org/download/ 一、安装编译工具及库文件 [rootVM-20-14-centos ~]# yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel二、安装 PCRE [rootVM-20-14-centos ~]# tar -zxvf pcre-8.35.tar.gz [r…

从热潮到理性,大模型迎来产业「拐点」

前言 无人不谈大模型&#xff0c;是今年上半年科技界的真实写照。 从市场热闹程度来看&#xff0c;大模型已经成为各家科技厂商争先涌入的赛道&#xff0c;无论是互联网巨头&#xff0c;还是科技公司&#xff0c;甚至是研究机构&#xff0c;均已加入这场大模型混战&#xff0…

k8s快速上手实操

前言 Kubernetes&#xff08;简称K8s&#xff09;是由Google开源的一个用于自动化部署、扩展和管理容器化应用程序的系统。自2014年发布以来&#xff0c;Kubernetes已经迅速成长为容器编排领域的标准&#xff0c;并在全球范围内得到了广泛的采用和认可。 Kubernetes作为现代容…