问题描述
先输入已经归坏掉的字符,要求我们在第二行输入的字符串中去掉这些字符,如果有+,则第二行字符中不能出现大写字母。
题目分析
我们创建一个bool类型的数组,遍历第一个字符串中的每一个字符,将对应的bool数组置为true,如果遍历到了大写字母,则要将坏掉字符中大写字母的小写字母也置为true。如果遇到了"+",我们就设置一个标记变量flag=1,表示我们输出的字符串中不能含有大写字母了。
然后我们再遍历第二个字符串,如果遍历到的字符不为true则可以输出。如果flag==1,则我们不可以输出大写字母。就这么简单。
但是还有一点需要说明,那就是第一行的坏掉字符串可能为空,就说明一个字符都没有坏掉,这种情况我们怎样输入呢,用空格吗?那样会被认为空格是坏键的。所以我们用getline()函数来进行输入,它允许我们输出一个纯空串。
代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<utility>
using namespace std;
#define MAXN 100010
string Std,wrong;
char res[MAXN];
bool useful[300];
int main()
{
int i;
//指示是否+坏掉了
bool flag=true;
int cnt;
//防止读入空串,这里一定要注意,我们选择用getline读取
getline(cin,wrong);
getline(cin,Std);
memset(useful,true,sizeof(useful));
for(i=0;i<wrong.size();i++)
{
if((wrong[i]>='A'&&wrong[i]<='Z'))
{
useful[wrong[i]]=false;
useful[wrong[i]+32]=false;
}
else if(wrong[i]=='+')
{
flag=false;
useful[wrong[i]]=false;
}
else
useful[wrong[i]]=false;
}
for(i=0,cnt=0;i<Std.size();i++)
{
if(!useful[Std[i]]||(Std[i]>='A'&&Std[i]<='Z'&&(!flag)))
continue;
else
{
printf("%c",Std[i]);
cnt++;
}
}
if(cnt)
printf("\n");
return 0;
}
答题用时15Min
Q33——finish√