跳到主要内容

HJ81. 字符串字符匹配

题目描述​

判断短字符串 S 中的所有字符是否都在长字符串 T 中出现。

输入格式​

  • 第 1 行:短字符串
  • 第 2 行:长字符串

输出格式​

若短串每个字符都在长串中出现,输出 true,否则输出 false。

示例​

示例 1​

输入:

bc
abc

输出:

true

示例 2​

输入:

aDc
abc

输出:

false

解题思路​

第一步:理解问题本质​

判断短串的每个字符是否是长串的字符集合的子集。只需关心"字符是否出现",与顺序、次数无关。

第二步:暴力解法​

对短串的每个字符,遍历长串逐个比较。O(len(S) × len(T)),简单但可优化。

第三步:最优解法(集合)​

先把长串转成集合 set(T),得到 O(1) 的成员查询,再用 all 检查短串每个字符:

long_set = set(long_s)
result = all(ch in long_set for ch in short_s)
print("true" if result else "false")

完整代码实现​

算法可视化 · 逐帧回放这道题的代码5 帧 · 录制输入
import sys


def solve():
data = sys.stdin.buffer.read().split()
short_s = data[0].decode()
long_s = data[1].decode()

long_set = set(long_s)
result = all(ch in long_set for ch in short_s)
print("true" if result else "false")


if __name__ == "__main__":
solve()

示例推演​

以示例 2(短串 aDc,长串 abc)为例:

  • 长串集合 {'a','b','c'}
  • 检查 a ∈ 集合 ✓
  • 检查 D ∈ 集合 ✗(区分大小写,D ≠ d)

结果:false。


复杂度分析​

解法时间复杂度空间复杂度说明
双重循环O(S·T)O(1)简单但慢
集合查询O(S+T)O(T)最优

易错点总结​

1. 大小写敏感​

本题区分大小写,D 与 d 不同。用集合时必须精确匹配。

2. 用集合会去重​

set(long_s) 自动去重,正好符合"只关心是否出现"的语义,不影响判断。

3. 空输入处理​

若短串为空,all([]) 返回 True;本题通常短串非空,但需注意边界。


扩展思考​

  • 集合去重的思想也可用于"判断两个字符串是否由相同字符构成"。
  • 若还需记录字符数量,可用 collections.Counter。

相关题目​

自测​

加载评论中...