旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 105 个字符的串。可用的字符包括字母 [a
-z
, A
-Z
]、数字 0
-9
、以及下划线 _
(代表空格)、,
、.
、-
、+
(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE.
7_This_is_a_test.
输出样例:
_hs_s_a_tst
cpp
/*
这里还是跟旧键盘一样的思路;用字符串一的字符去匹配字符串2内的字符,如果找到相同的
则在字符串2中将字符赋值为不是给定值内的其他字符,在输出时遇到该种字符就不输出;
注意这里'+'是上档键,用它遍历时去找大写字符;
这里注意串长度最大10的5次方,双重循环会可能超时;
但是字符串一长度最大为26+10+1+4==41;这里坏键只用大写字母表示;
注意这里是第二行非空,不是两行非空,读题要仔细啊;
*/
#include<iostream>
#include<string>
#define null '#'
using namespace std;
int main(){
//输入两字符串;
string s1,s2;
cin>>s1>>s2;
if(s2==""){ //这里注意cin读入string是从第一个非空格非换行字符开始的;
//然而这里题目说的是第二行非空,不保证一定有坏键;
s2=s1;
s1="";
}
//遍历;
for(int i=0;i<(int)s1.length();i++){ //从s1中逐个取出字符;
for(int j=0;j<(int)s2.length();j++){ //字符与s2中字符逐个比较;
if(s1[i]>='0'&&s1[i]<='9'){ //s1字符为数字;
if(s1[i]==s2[j]){
s2[j]=null; //赋值为空;
}
}
if(s1[i]>='A'&&s1[i]<='Z'){ //s1字符为字母;
if(s1[i]==s2[j]||s1[i]==s2[j]-32){ //大小写都可能;
s2[j]=null;
}
}
if(s1[i]=='+'){ //上档键坏1;
if(s2[j]>='A'&&s2[j]<='Z'){
s2[j]=null;
}
}
if(s1[i]==s2[j]){ //其他字符;
s2[j]=null;
}
}
}
//查看有没有能输出的字符;
int flag=0;
for(int i=0;i<(int)s2.length();i++){
if(s2[i]!=null){
flag=1;
}
}
//输出;
if(flag==0){
//无字符,输出空行;
}
else if(flag==1){
for(int i=0;i<(int)s2.length();i++){
if(s2[i]!=null){
cout<<s2[i];
}
}
}
cout<<endl;
return 0;
}
/*
反思:读题要仔细,不要自以为是;还有这里string在cin时不会读入空字符串;
所以有一行为空时会自动读入下一行;
*/