L1-011 A-B(20分)[java][python]

6 阅读2分钟

题目编号:L1-011
分数:20分
语言:Java、Python

题目描述

本题要求你计算 A−B。不过麻烦的是,A 和B 都是字符串 —— 即从字符串 A 中把字符串 B 所包含的字符全删掉,剩下的字符组成的就是字符串 A−B。

输入格式

输入在 2 行中分别给出字符串 A 和 B,均为长度不超过 10410^4 的、由可见 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 的集合推导式让实现非常简洁。