PAT A1050 String Subtraction
Sample Input:
They are students.
aeiou
Sample Output:
Thy r stdnts.
-
思路 1:
遍历s2,对s2的每一个字符,如果在s1中能找到对应的 -> erase掉,遍历完s2,得到的s1就是Ans; -
code 1:
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int main(){
string s1, s2;
getline(cin, s1);
getline(cin, s2);
for(int i = 0; i < s2.size(); ++i){
//!!!:TIPS 1:
while(s1.find(s2[i]) != string::npos){
s1.erase(s1.find(s2[i]), 1);
}
}
cout << s1;
return 0;
}
-
TIPS 1:
坏习惯:for(int i=0; i < s.size(); ++i)
,不要把s.size()放到循环里,1)这样每轮循环都会做一次s.size()操作(O(N))导致复杂度变为O(N2),2)有时候在循环内对s做增删操作导致s.size()不断变化,无法退出循环 -
思路 2:
hash表记录s2中出现过的字符,遍历s1遇到s2中没出现的(hash表中为false的)就输出 -
code 2:
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
const int maxn = 256;
bool has[maxn] = {false}; //不能是true,会出错??
int main(){
string s1, s2;
getline(cin, s1);
getline(cin, s2);
for(int i = 0; i < s2.size(); ++i){
has[s2[i]] = true;
}
for(int i = 0; i < s1.size(); ++i){
if(has[s1[i]] == false) printf("%c", s1[i]);
}
return 0;
}