L1-011 A-B
L1-011 A-B
题目
本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过 10 4 10^4 104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A−B的结果字符串。
输入样例:
I love GPLT! It's a fun game!
aeiou
输出样例:
I lv GPLT! It's fn gm!
C++ 代码
#include <iostream>
#include <string>
// 用于快速判断字符是否存在
#include <unordered_set>
using namespace std;
int main() {
string a, b;
// 读取两行完整字符串(包含空格)
getline(cin, a);
getline(cin, b);
// 把 B 的字符存入集合,方便 O(1) 查找
unordered_set<char> to_delete(b.begin(), b.end());
// 遍历 A,只保留不在 B 中的字符
for (char c : a) {
if (to_delete.find(c) == to_delete.end()) {
cout << c;
}
}
return 0;
}
第一部分:getline 函数详解
1. 作用
读取一整行字符串,包括空格、空白字符,直到遇到换行符停止。
2. 头文件
#include <string>
3. 语法格式
getline(输入流, 字符串变量);
4. 代码中的用法
getline(cin, a); // 读取第一行字符串存入 a
getline(cin, b); // 读取第二行字符串存入 b
5. 为什么必须用 getline
cin >> 字符串遇到空格就停止读取- 题目字符串包含空格,必须用
getline读整行
6. 特点
- 读取整行,保留所有空格
- 自动忽略行尾换行符
- 适合读取带空白的句子
第二部分:unordered_set 集合 超详细全面讲解
1. 集合是什么
unordered_set 是 C++ STL 中的无序集合容器。
- 存储不重复元素
- 查找、插入、删除速度极快 O(1)
- 主要用途:快速判断元素是否存在
2. 必须包含的头文件
#include <unordered_set>
3. 代码中这一行的完整解析
unordered_set<char> to_delete(b.begin(), b.end());
unordered_set<char>:定义存储字符类型的集合to_delete:要删除的字符集合(黑名单)b.begin():字符串 b 的起始位置b.end():字符串 b 的结束位置- 整体功能:把字符串 b 的所有字符批量插入集合

4. 常用核心用法
① 创建集合
unordered_set<char> s;
② 插入元素
s.insert('a');
③ 查找元素(本题最重要)
if (s.find(c) == s.end()) {
// 不在集合中,保留输出
}
④ 删除元素
s.erase('a');
⑤ 获取元素个数
s.size();
⑥ 判断是否为空
s.empty();
⑦ 清空集合
s.clear();
⑧ 遍历集合
这里分 两种遍历方式:
方式 1:范围 for 循环(最简单)
for (char c : s) {
cout << c;
}
方式 2:迭代器遍历
for (auto it = s.begin(); it != s.end(); it++) {
cout << *it << endl;
}
逐行逐词拆解
-
auto itauto:自动推导类型it:迭代器变量,相当于指向集合元素的指针
-
s.begin()- 获取集合第一个元素的迭代器
-
it != s.end()- 循环条件:迭代器没有走到集合末尾就继续
-
it++- 迭代器向后移动,指向下一个元素
-
*it- 取值操作
- 取出迭代器当前指向的元素本身
整段代码功能
从头到尾遍历集合中所有元素,并依次输出。
645



被折叠的 条评论
为什么被折叠?



