方法一:
一种直观的解是,先对第一个字串排序,然后逐个字符在第二个字串中搜索,把搜索不到的字符输出,就是所要的结果。
然而,算法库中有一个集合差运算set_difference,而且要求两个集合容器是已经排好序的。乍一看,好像是针对集合差运算来的。
1 #include<iostream> 2 #include<fstream> 3 #include<algorithm> 4 using namespace std; 5 6 int main() 7 { 8 ifstream in("remainder.txt"); 9 for (string s,t,u; in >> s >> t;u="") 10 { 11 sort(s.begin(), s.end()); 12 sort(t.begin(), t.end()); 13 set_difference(s.begin(),s.end(),t.begin(),t.end(),back_inserter(u)); 14 cout << u << endl; 15 } 16 }
方法二:
然而注意到,对两个集合分别排序的代价是大的。事实上,t串无需排序,下面的解法,更高效:
1 #include<iostream> 2 #include<fstream> 3 #include<algorithm> 4 using namespace std; 5 6 int main() 7 { 8 ifstream in("remainder.txt"); 9 for (string s,t; in >> s >> t;) 10 { 11 sort(s.begin(), s.end()); 12 for (int i = 0; i < s.length();++i) 13 if (t.find(s[i]) == string::npos) cout << s[i]; 14 cout <<endl; 15 } 16 }