原题: https://www.patest.cn/contests/pat-b-practise/1033
思路: 首先能输出的字符肯定都在想输出的字符串中, 只要一个一个读入字符,
每次判断这个字符能不能输出即可. 关键问题是, 写根据错误按键序列, 判断
当前字符能不能打出的函数. 逻辑梳理清晰后不难写出.
坑1: 如果一个字符都打不出, 输出 '
'
坑2: 如果没有坏按键, 则全部字符都能打出.
完整实现:
#include <stdio.h>
#include <string.h>
// _ . , - +
int isWrongKey (char wrong[], char ch);
int main (void) {
char wrong[60]; // 错误按键字符串
char want[100010]; // 想打出的字符串
int len; // 想打出字符串长度
int i;
gets(wrong);
scanf("%s", want);
len = strlen(want);
if (strlen(wrong) == 0) {
// 如果全部按键都正常
printf("%s", want);
} else {
for (i=0; i<len; i++) {
if (isWrongKey(wrong, want[i]) == 1) {
printf("%c", want[i]);
}
}
}
printf("
");
return 0;
}
// 检查当前字符ch, 能不能打出
// 1能输出, 0不能输出
int isWrongKey (char wrong[], char ch) {
int len = strlen(wrong);
int type; // 2小写字母 3大写字母
int i;
if (ch >= 'a' && ch <= 'z') type = 2;
if (ch >= 'A' && ch <= 'Z') type = 3;
// 全部大写坏掉
for (i=0; i<len; i++) {
if (wrong[i] == '+' && type == 3) return 0;
}
for (i=0; i<len; i++) {
if (wrong[i] >= 'A' && wrong[i] <= 'Z') {
// wrong[i]大写字母, ch小写字母
if (type == 2) {
if (wrong[i] == (ch - 32)) return 0;
}
// wrong[i]大写字母, ch大写字母
if (type == 3) {
if (wrong[i] == ch) return 0;
}
} else {
// 直接坏键
if (wrong[i] == ch) return 0;
}
}
// 其它情况, 该键打出
return 1;
}