【蓝桥杯】 用杂志拼接信件:实现一个算法确定能否由杂志构成信件。介绍如下: 影视剧中信件大多是从报纸或杂志上的字符剪下来拼接而成的。 杂志和信件均由字符串构成,对于给定的杂志和信件,确定信件是否...

【蓝桥杯】 用杂志拼接信件

题目描述

题目传送门 >> 用杂志拼接信件

【问题描述】
实现一个算法确定能否由杂志构成信件。介绍如下:
影视剧中信件大多是从报纸或杂志上的字符剪下来拼接而成的。
杂志和信件均由字符串构成,对于给定的杂志和信件,确定信件是否可以由杂志上的字符构成。
例如杂志为 ab,信件为 aa,则不能构成。杂志为 aab,信件为 aa,则可以构成。

【输入描述】
输入两行字符串,长度均不超过 100。
第一行为杂志字符串,第二行为信件字符串。

【输出描述】
输出一行,若信件可由杂志构成则输出 YES,否则输出 NO。

【输入输出样例】
示例1
输入:

 ab
 aa

输出:

 NO

【运行限制】
• 最大运行时间:1s
• 最大运行内存: 256M


解题代码

C语言

【解题思路】:从ASCII 编码一览表中可以看出,ASCII码从32到126为可显示字符。将某个字符出现的次数,存放于count[该字符的ascii码-32]中,例如,"A"出现了3次,则用 count[65-32]=3 记录。

#include <stdio.h>
#include <string.h>
int main()
{
	char mgz[100],letter[100];
	int count[100]={0},i,lenMgz,lenLetter;
	// 输入杂志和信件
	gets(mgz);
	gets(letter);
	// 获取杂志和信件的长度
	lenMgz = strlen(mgz);
	lenLetter = strlen(letter);
	// 若杂志的字少于信件,则肯定为NO
	if(lenMgz<lenLetter){
		printf("%s","NO");
		return 0;
	}
	// 将杂志出现的每个字符的次数,记录在count[]中
	for(i=0; i<lenMgz;++i){
		++count[mgz[i]-32];
	}
	// 若信件需要某个字符,count[]对应位置就-1,若减至负数,则说明不够用了,输出"NO"
	for(i=0; i<lenLetter;++i){
		if(--count[letter[i]-32] <0){
			printf("%s","NO");
			return 0;
		}
	}
	printf("%s","YES");
	return 0;
}

Java

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int count[] = new int[100];
        String mgz = scan.next();
        String letter = scan.next();
        int lenMgz = mgz.length();
        int lenLetter = letter.length();
        if(lenMgz<lenLetter) {
          System.out.println("NO");
          return;
        }
        for(int i=0;i<lenMgz;++i) {
          ++count[mgz.charAt(i)-32];
        }
        for(int i=0;i<lenLetter;++i) {
          if(--count[letter.charAt(i)-32]<0) {
            System.out.println("NO");
            return;
          }
        }
        System.out.println("YES");
        scan.close();
    }
}

测试用例

测试1
输入:

 acbb
 acd

输出:

 NO

测试2
输入:

 acbb
 abc

输出:

 YES
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值