1033 旧键盘打字(20)(20 分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过10^5^个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE.
7_This_is_a_test.
输出样例:
_hs_s_a_tst
//原先的想法差不多,就是输入两个字符串,然后得到两个字符串长度,将第一个字符串出现的字符隔离,然后输出第二个字符串未被隔离的字符。
原先代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char input[1001000];
char output[1001000];
gets(input);
gets(output);
int l1=strlen(input);
int l2=strlen(output);
int i,j,up=1;
for(i=0; i<l1; i++)
{
if(input[i]=='+')
{
up=0;//标志,大写字母隔离。
}
}
for(i=0; i<l2; i++)
{
if(up==0)
{
if(output[i]>='A'&&output[i]<='Z')//隔离大写字母。
{
output[i]='\0';
}
}
for(j=0; j<l1; j++)//这里想法很淳朴,就是想通国一个二重循环隔离第二个字符串中的字符。但是复杂度是O(N*N),太大了,所以最后一个测试点没过。
{
if(input[j]==output[i])
{
output[i]='\0';
}
if(input[j]-'A'+'a'==output[i])
{
output[i]='\0';
}
}
}
else
{
for(i=0; i<l2; i++)
{
if(output[i]!='\0')
printf("%c",output[i]);
}
}
return 0;
}
查看大神代码后的启发:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char input[100100];
char output[100100];
int cov[128]= {0};//此处收大神启发,ascll码128位。
gets(input);//scanf不能识别换行符,此处是一坑,第三个测试点就是第一行为空,即没有键坏的情况。只能用gets;此处卡了很久。
gets(output);//此处可以用scanf,
int l1=strlen(input);
int l2=strlen(output);
int i,j;
for(i=0; i<l1; i++)
{
if(input[i]>='A'&&input[i]<='Z')//将坏的键隔离,大小写字母全隔离。
{
cov[input[i]-'\0']=1;
cov[input[i]-'A'+'a'-'\0']=1;
}
else if(input[i]=='+')//若有+,不仅要隔离+本身,还要隔离所有大写字母
{
for(j='A'; j<='Z'; j++)
{
cov[j-'\0']=1;
cov['+'-'\0']=1;
}
}
else//剩余其他键逐一隔离
{
cov[input[i]-'\0']=1;
}
}
//处理输出的字符串,隔离过的不能输出,其余按照原先字符串顺序输出。
for(i=0; i<l2; i++)
{
if(cov[output[i]-'\0']==0)
printf("%c",output[i]);
}
若全部隔离,输出空行。
printf("\n");
return 0;
}