删除公共字符
题目描述
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.” 输入描述:
每个测试输入包含2个字符串
输出描述:
输出删除后的字符串
示例1
输入: They are students. aeiou 输出 Thy r stdnts.
解题思路
解法一 这里我们用到了unordered_map,通过unordered_map统计第二个字符串中的所有字符,然后遍历第一个字符串,找第一个字符串中的字符在第二个字符串中也有的,就不添加到临时创建的字符串ret中,剩下未出现在第二个字符串中的字符就添加至ret中,最后输出ret就是删除了第二个字符串中所有字符的第一个字符串。
解法二 这种方法就比较粗暴了,但是很好理解,遍历第一个字符串,到第二个字符串中找出现在第一个中也出现在第二个中的字符,得到该字符的下标,删除字符串中该下标对应的字符,最后返回第一个字符串即可。
解法三 这种方法其实和方法一的思路相似,这里用到了哈希表的思想,依旧是遍历第二个字符串将字符映射至哈希表对应的位置,再通过遍历第一个字符串,看哈希表对应位置的字符是否存在,若不存在这说明该字符是只在第一个字符串中出现的,将该字符加入ret中,最后输出即可。
代码实现
解法一
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
string strA; getline(cin,strA);
string strB; getline(cin,strB);
unordered_map<char,int> mp;
string ret = "";
for(auto& e:strB)
{
mp[e]++;
}
for(size_t i = 0;i < strA.size();++i)
{
if(mp.find(strA[i]) != mp.end()&& mp[strA[i]] > 0)
continue;
ret += strA[i];
}
cout << ret << endl;
return 0;
}
解法二
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2;
getline(cin, s1);
getline(cin, s2);
for (int i = 0; i < s2.size(); i++)
{
int index;
while((index=s1.find(s2[i]))!=-1)
{
s1.erase(index, 1);
}
}
cout << s1 << endl;
return 0;
}
解法三
#include<iostream>
#include<string>
using namespace std;
int main() {
// 注意这里不能使用cin接收,因为cin遇到空格就结束了。
// oj中IO输入字符串最好使用getline。
string str1, str2;
//cin>>str1;
//cin>>str2;
getline(cin, str1);
getline(cin, str2);
// 使用哈希映射思想先str2统计字符出现的次数
int hashtable[256] = {0};
for (size_t i = 0; i < str2.size(); ++i) {
hashtable[str2[i]]++;
}
// 遍历str1,str1[i]映射hashtable对应位置为0,则表示这个字符在
// str2中没有出现过,则将他+=到ret。注意这里最好不要str1.erases(i) // 因为边遍历,边erase,容易出错。
string ret;
for (size_t i = 0; i < str1.size(); ++i)
{
if (hashtable[str1[i]] == 0)
ret += str1[i];
}
cout << ret << endl;
return 0;
}