一、题目描述
- 给定一个字符串s1和一个字符串s2;判断字符串s1中的字符,如果这个字符在s2中也出现过,那么就将这个字符从s1中删除
- 例如:
- s1为Hello,s2为World
- s1中的l和o都在s2中出现过,因此需要删除s1中的字符l和字符o,所有最终打印He
二、解题思路
- 把s1存入到一个set中(set的key是唯一的),然后遍历s2的每个字符,如果这个字符在set中出现过,那么就将这个字符从set中删除
- 删除之后我们添加了一个打印功能:
- 打印s1之后的样子,但是实际上我们是对set进行操作的,s1本身没变;并且因为set在insert()和erase()操作的时候元素的顺序会改变
- 因此我们就根据遍历s1的每个字符,看其是否在更新之后的set中出现过,如果出现了就打印
三、编程实现
#include <iostream>
#include <string>
#include <set>
using namespace std;
int main()
{
size_t i;
// 输入s1和s2
std::string s1, s2;
std::cout << "Enter s1: ";
std::cin >> s1;
std::cout << "Enter s2: ";
std::cin >> s2;
// 定义一个set, 将s1的字符都添加进去
// 备注: 由于set中的key是不允许重复的, 因此插入元素的时候如果该元素已存在则什么都不做
std::set<char> s;
for(i = 0; i < s1.length(); i++)
s.insert(s1[i]);
// 遍历s2中的字符, 如果该字符在set中出现过, 那么就将这个元素删除
for(i = 0; i < s2.length(); ++i)
{
// 如果这个元素在s中存在, 则找到这个元素的位置并删除
if(s.count(s2[i]))
s.erase(s.find(s2[i]));
}
// 下面开始打印修改后的内容, 由于set的内容是动态变化的, 因此可能与之前的字符顺序不一样, 所以不能直接打印
// 此处我们利用s1和set一起协作来打印
for(i = 0; i < s1.length(); ++i)
{
// 如果这个字符在set中有就打印
if(s.count(s1[i]))
std::cout << s1[i];
}
std::cout << std::endl;
return 0;
}