SWE IC15 · VO Live Coding

Pinterest Source/Target 字符组成:Set 语义与次数约束

IC15 题目描述把 source 各字符放入 set 后扫描 target;本文解释字符可重复使用的训练语义、复杂度与不能误用频次的边界。

题目重点:IC15 题目描述把 source 各字符放入 set 后扫描 target;本文解释字符可重复使用的训练语义、复杂度与不能误用频次的边界。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版完全遵循题目所述 set 方案:source 中字符只需出现一次即可在 target 里重复使用,区分大小写,按 Python 字符串的 Unicode code point 比较。
  • 如果面试官真正要求每个 source 字符只能消耗一次,应改为频次数组或 Counter;题目描述的 set 解法不满足这种消耗语义。
  • 空 target 返回 true,空 source 且非空 target 返回 false;不做 Unicode 规范化,现场若涉及组合字符须另定规则。

解题路线

  1. 先厘清“组成”指可重复使用字符种类,还是只能使用每个字符的实际出现次数。题目明确用 set,因此本文采用前者。
  2. O(|source|) 建 available 字符集合,然后扫描 target,每个字符必须属于 available。
  3. 任一字符不在集合中立即返回 false;所有字符通过后返回 true。
  4. 用双层线性扫描作独立参考,随机生成 source/target 对照,并覆盖重复 target 字符与空输入。

手动走一遍

source='abc'、target='caa' 返回 true:a 虽只在 source 出现一次,但 set 训练语义允许重用。source='abc'、target='cad' 返回 false,因为 d 不在 source。若题意是不允许重用,'caa' 应返回 false。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

"""Can target be written using characters occurring in source? Reuse is allowed."""


def can_compose_from_character_set(source: str, target: str) -> bool:
    available = set(source)
    return all(character in available for character in target)

复杂度

source 长度 S、target 长度 T;哈希期望 O(S+T) 时间,额外 O(U) 空间,U 为 source 不同字符数。哈希退化的最坏时间依语言实现;若字符集为固定 ASCII,可用定长布尔数组。

易错点与追问

容易失分的边界

  • 没有确认是否允许重复使用,就把 set 解冒称唯一解。
  • 只比较 source 与 target 的字符种类数目,忽略具体字符。
  • 把字符串大小写或 Unicode 归一化当作已给题面规则。
  • 把 part 2 的谐音编号推成完整原题。

继续深挖

  • 若每个字符只能消耗一次,如何用 Counter 对比?
  • 若 target 极长且以流输入,怎样早停并控制内存?
  • 若比较按用户可见字素簇而非 code point,怎样规范化?
✓已复制微信号!