题目描述
思路解析动画文字版
记住「s 建需求账本 → 扫 t:账本还要就认领、不要就替换」,下面每帧都在套它。
屏幕上是 t="practice" 的每个字符,待会儿一个个判断它该保留还是替换。
先统计 s 的需求账本:c×1 d×1 e×3 l×1 o×1 t×1。这就是 t 最终要凑齐的字母清单。
开始从左到右扫 t。指针指向当前字符,对照账本决定它的命运。
扫到 t[0]=p。查账本:p 还需要 0 个。不需要了 → 多余。
p 是多余的(红色),必须替换掉,已替换 1 步。
扫到 t[1]=r。查账本:r 还需要 0 个。不需要了 → 多余。
r 是多余的(红色),必须替换掉,已替换 2 步。
扫到 t[2]=a。查账本:a 还需要 0 个。不需要了 → 多余。
a 是多余的(红色),必须替换掉,已替换 3 步。
扫到 t[3]=c。查账本:c 还需要 1 个。还需要 → 可以认领。
c 被认领(绿色),s 账本里 c 减到 0。这个字符保留、不用改。
扫到 t[4]=t。查账本:t 还需要 1 个。还需要 → 可以认领。
t 被认领(绿色),s 账本里 t 减到 0。这个字符保留、不用改。
扫到 t[5]=i。查账本:i 还需要 0 个。不需要了 → 多余。
i 是多余的(红色),必须替换掉,已替换 4 步。
扫到 t[6]=c。查账本:c 还需要 0 个。不需要了 → 多余。
c 是多余的(红色),必须替换掉,已替换 5 步。
扫到 t[7]=e。查账本:e 还需要 3 个。还需要 → 可以认领。
e 被认领(绿色),s 账本里 e 减到 2。这个字符保留、不用改。
扫完 t:绿色 3 个是能保留的,红色 5 个是多余、必须替换的。所以最少替换 5 步——把这 5 个红字符改成 s 还缺的字母即可。
边界先想清:单字符、全不同、已是异位词。
面试重点:讲清「一次替换消一对」与「等长前提」。
参考代码
class Solution: def minSteps(self, s: str, t: str) -> int: cnt = [0] * 26 for ch in s: cnt[ord(ch) - 97] += 1 for ch in t: cnt[ord(ch) - 97] -= 1 return sum(x for x in cnt if x > 0)复杂度
- 时间:O(n),各扫 s、t 一遍
- 空间:O(1),固定 26 个字母的计数
易错点
面试追问把动画讲成自己的话
追问为什么「t 多余字符数」就等于答案?
追问如果 s、t 不等长还能这么做吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
确定两个字符串是否接近
LeetCode 1657 · 中等 · 沿着 哈希套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题