Given two strings S1 and S2, S=S1−S2 is defined to be the remaining string after taking all the characters in S2 from S1. Your task is simply to calculate S1−S2 for any given strings. However, it might not be that simple to do it fast.
Input Specification:
Each input file contains one test case. Each case consists of two lines which gives S1 and S2, respectively. The string lengths of both strings are no more than 104. It is guaranteed that all the characters are visible ASCII codes and white space, and a new line character signals the end of a string.
Output Specification:
For each test case, print S1−S2 in one line.
Sample Input:
They are students.
aeiou
Sample Output:
Thy r stdnts.
解题思路:
给出两行字符串,要求在第一行字符串中删去第二行字符串包含的字符。
因为有速度上的要求,所以用两个循环来做肯定是不行的。所以我们在读入第二行的字符时需要对他们做一个标记,带有这个标记的字符在输出的时候就可以不输出,时间复杂度就是O(n)啦;用map就可以很好的解决这个问题。
因为是对每个字符进行标记所以要用char,map<char,int>这种,用string反而会麻烦。
char读取一行的代码如下:
char b;
b = getchar();//读取字符
while(b != '\n'){//当不是换行的时候
S1[j]=b;//塞入char数组
j++;//下标往后移动
b = getchar();//继续读取下一个字符
}
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
map<char,int> print;//标记该字符是否需要输出
char S1[10001];//记录S1字符串
int j=0;//统计S1字符串有几个字符
char b;
b = getchar();
while(b != '\n'){
S1[j]=b;
j++;
b = getchar();
}
b = getchar();
while(b != '\n'){
print[b]=1;
b = getchar();
}
for(int i=0;i<j;i++){
if(print.count(S1[i]) > 0 ){
}
else{
cout<<S1[i];
}
}
return 0;
}