SWE · Coding / Onsite summary

Airbnb Review Token 打标:保留原文大小写的 Span 替换

评论文本与实体→标签表的示例要求输出 [type]{原文};从匹配 span、重叠选择到输出转义解释。

题目重点:评论文本与实体→标签表的示例要求输出 [type]{原文};从匹配 span、重叠选择到输出转义解释。

题意与假设

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

  • 训练版用 Unicode casefold 做大小写无关匹配,保留 review 原始 span 作为花括号内容。
  • 仅匹配完整词边界,避免 'air' 匹配 'airport';词边界对于非拉丁文字可能需另定义。
  • 多个模式起点相同取最长,长度仍同按输入映射顺序;选非重叠 span 从左到右输出,题目未规定冲突策略。

解题路线

  1. 先将词典键归一化并编译匹配器,找到原文中的候选 (start,end,label);casefold 可能改变 Unicode 字符长度,生产实现应使用能返回原文索引的大小写无关正则或明确字符映射,不能简单拿折叠后下标切原文。
  2. 按 start 升序、长度降序及稳定词典顺序排序,贪心选非重叠候选;若需要最大覆盖或优先级规则不同,则改成对应区间选择策略。
  3. 用游标拼接:先追加上个结束位置到 span 起点的原文,再追加 [label]{review[start:end]},最后追加尾部;不对已替换的字符串二次替换。
  4. 检查多词实体、大小写变化、重复出现、标点边界、重叠词、空词典和原文中已有 []{} 字符。

手动走一遍

题目句子中 'Airbnb' 命中 business,原文 'San Francisco' 与词典键 'san francisco' 大小写不同但命中 city;输出标签包裹的仍是原文大小写。若 'San' 也是实体,训练 tie-break 选更长的 'San Francisco'。

规模与取舍

朴素对 K 个词典键分别扫描长度 N 的评论约 O(KN) 加候选排序 O(M log M);词典/文本较大可用 Trie/Aho–Corasick 或支持多模式的正则,但大小写与边界语义需保持一致。

易错点与追问

容易失分的边界

  • 先把评论整体 lower/casefold 后输出,丢原始大小写。
  • 直接 str.replace 导致多词重叠与二次替换。
  • 在 casefold 后字符串用同一数值下标切原文,Unicode 长度变化时错位。
  • 把词内子串当独立实体。
  • 假装题目给了所有冲突与转义规则。

继续深挖

  • 实体重叠时改用业务优先级怎么办?
  • 百万词典怎样做多模式匹配?
  • 含中文/emoji 如何定义词边界?
  • 若标签名或原文含特殊括号,输出如何转义?
✓已复制微信号!