C/C++面试:35---删除字符串s1中在字符串s2中出现的字符

一、题目描述

  • 给定一个字符串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;
}
  • 运行效果如下:

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/107723730