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