Ticker 符号映射的编辑距离
Edit Distance for Ticker-Symbol Mapping
开始编码某风险聚合台需要把来自三套不同交易捕获系统的持仓表合并到一起。两套系统把同一个标的写成 AAPL,第三套却写成 AAPL.US;公司动作工具有时把 BRK.A 写成 BRK-A。在按 symbol 字段做 join 之前,你需要一个对两个 ticker 字符串的模糊距离——它能告诉你两个串相差多少个单字符编辑,便于自动化规则按「距离 ≤ 1 自动合并、距离为 2 升级到人工核对、再大就拒绝」来分流。请实现标准 Levenshtein 编辑距离:把 s 转成 t 所需的最少插入、删除、替换次数(每次代价为 1),刻画「跨数据源 ticker 模糊匹配」这件最常见的脏数据问题。
请实现 solution(s: str, t: str) -> int,返回最小编辑次数。边界约定:完全相同的两串返回 0;其中一边为空时返回另一边的长度(要把每个字符都插入或删除);两边都为空时返回 0。字符串长度上限 1000,字符集限定为字母数字加分隔符 .、-、_,不含空白也不含 Unicode 视觉混淆字符。
示例 1(完全相同 → 0): solution('AAPL', 'AAPL') 返回 0。示例 2(单次编辑 → 1): solution('SPY', 'SPX') 返回 1——只需要把 Y 替换成 X。示例 3(三次编辑): solution('TSLA', 'NVDA') 返回 3——T→N、S→V、L→D 三次替换,末尾的 A 自然对齐。直接递归会在每个前缀上分裂出三条子问题,复杂度爆炸;用 (i, j) 前缀长度作为状态记忆化即可,标准 Levenshtein DP 是 O(m·n) 时间,把内层维度对齐到「较短的串」之后用滚动数组可以把空间压到 O(min(m, n))——这正是 1000×1000 能稳稳跑进时限的关键。最容易踩坑的正确性 bug 是某一格只看一种转移:必须在替换、删除、插入三者间取 min,否则对中间不匹配的情形会算出虚高的距离。
约束条件
- 0 ≤ len(s), len(t) ≤ 1000
- 字符集为字母数字(`A-Z`, `a-z`, `0-9`)外加分隔符 `.`、`-`、`_`
- 插入 / 删除 / 替换每次操作代价均为 1(标准 Levenshtein 距离)
- 两串相同时返回 0;其中一边为空时返回另一边的长度
- 返回值是非负整数
样例
Case 1 · both empty
输入: ["",""]
期望: 0
两个串都为空,无需任何编辑操作,距离为 0。
Case 2 · one empty (delete-only)
输入: ["AAPL",""]
期望: 4
其中一边为空时,编辑距离恰好是另一边的长度——这里需要删掉 'AAPL' 的全部 4 个字符。
Case 3 · identical tickers
输入: ["AAPL","AAPL"]
期望: 0
完全相同的两个 ticker 直接命中匹配分支,距离为 0——融合数据源时这是绝大多数情况。
Case 4 · three-edit substitution chain
输入: ["TSLA","NVDA"]
期望: 3
T→N、S→V、L→D 三次替换,A 自身对齐,总共 3 次编辑。这是 dp[i][j] 主对角线 + 替换分支的经典样本。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · both empty
输入: ["",""]
期望: 0
两个串都为空,无需任何编辑操作,距离为 0。
Case 2 · one empty (delete-only)
输入: ["AAPL",""]
期望: 4
其中一边为空时,编辑距离恰好是另一边的长度——这里需要删掉 'AAPL' 的全部 4 个字符。
Case 3 · identical tickers
输入: ["AAPL","AAPL"]
期望: 0
完全相同的两个 ticker 直接命中匹配分支,距离为 0——融合数据源时这是绝大多数情况。
Case 4 · three-edit substitution chain
输入: ["TSLA","NVDA"]
期望: 3
T→N、S→V、L→D 三次替换,A 自身对齐,总共 3 次编辑。这是 dp[i][j] 主对角线 + 替换分支的经典样本。