旧键盘打字
题目描述
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 $10^5$ 个字符的串。可用的字符包括字母 [a
-z
, A
-Z
]、数字 0
-9
、以及下划线 _
(代表空格)、,
、.
、-
、+
(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例
1 | 7+IE. |
输出样例
1 | _hs_s_a_tst |
问题解决
解题思想
下面的代码1与代码2大同小异。代码1没有’’充分’’运用散列,其只把大小写字母和数字’’充分’’进行散列,其它几个字符进行了单独处理,充分利用了空间,代码不简洁。代码2进行了完全散列,因为这些字符的ASCII码不会超过128,故将字符散列数组开到128,这样就简化了代码,这种方式更优。
定义字符散列数组str_hash[],初始化为0,读入第一行字符串,对每一个字符(坏掉的键)c,将str_hash[c]置为1;读入第二行字符串,对该字符串的每一个字符,先检查其是否能输出,若相应的键已坏掉,则跳过输出,进行下一次判断。
坑点提醒
题目保证第 2 行输入的文字串非空,但没保证第1行输入的文字串非空,因此若第1行输入为空时要有相应的处理,否则将导致测试点2不通过。若第1行文字串的输入用如下形式:
1 | scanf("%s",str); |
则当第1行为空时,由于%s不能读入回车,其会跳过第1行直接将第2行的内容读入str[]。此处我们可采用如下方式来读入,这样第1行为空时也不会影响到下一行,当然还有很多其它方式。
1 | for(int i = 0; (c = getchar()) != '\n'; i++){ |
代码示例(C/C++)
代码1
1 | //此法没有'充分'利用散列,但节省空间 |
代码2
1 | //'充分'利用散列,代码较简洁 |
题目来源:PAT乙级1033
作者:CHEN, Yue
单位:浙江大学