【牛客网】—— 删除公共字符三种解法

    xiaoxiao2024-10-19  76

    删除公共字符

    题目描述

    输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”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; }
    最新回复(0)