题目编号:L1-011
分数:20分
语言:Java、Python
题目描述
本题要求你计算 A−B。不过麻烦的是,A 和B 都是字符串 —— 即从字符串 A 中把字符串 B 所包含的字符全删掉,剩下的字符组成的就是字符串 A−B。
输入格式
输入在 2 行中分别给出字符串 A 和 B,均为长度不超过 的、由可见 ASCII 码和空格组成的非空字符串。
输出格式
在一行中打印出 A−B 的结果字符串。
输入样例
I love GPLT! So do I!
aeiou
输出样例
I lv GPLT! S d I!
解题思路
将字符串 B 中的所有字符存入一个集合(HashSet),然后遍历字符串 A,保留不在集合中的字符,拼接成结果字符串输出。
关键点:
- B 中可能包含空格,需要原样读取整行
- 使用
Set去重可以提高查找效率 - Java 中用
BufferedReader读取含空格的整行
代码实现
Java 实现
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String a = br.readLine();
String b = br.readLine();
Set<Character> setB = new HashSet<>();
for (char c : b.toCharArray()) {
setB.add(c);
}
StringBuilder sb = new StringBuilder();
for (char c : a.toCharArray()) {
if (!setB.contains(c)) {
sb.append(c);
}
}
System.out.println(sb.toString());
}
}
Python 实现
a = input()
b = input()
set_b = set(b)
result = ''.join(c for c in a if c not in set_b)
print(result)
运行验证
输入:
I love GPLT! So do I!
aeiou
Java / Python 输出:
I lv GPLT! S d I!
与样例一致,通过验证。
复杂度分析
- 时间复杂度:O(|A| + |B|),构建集合 O(|B|),遍历 A O(|A|)
- 空间复杂度:O(|B|),存储 B 中的字符集合
总结
本题是字符串差集操作,核心思路是利用集合的 O(1) 查找特性,将字符串 A 中所有出现在 B 中的字符删除。注意输入需要读取整行(包含空格),Python 的集合推导式让实现非常简洁。