会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员,或
购买
该题目所属题库
,可解锁完整内容。
解题思路
本题是经典的“最小覆盖子串”问题,适用 滑动窗口 + 计数 的思想。核心做法如下:
- 用一个长度为 128 的整型数组
need 统计字符串 t 中每个字符需要的数量(只含英文字母,用 ASCII 足够)。
- 维护双指针
[left, right] 表示当前窗口,并维护变量 missing 表示还缺多少个字符(按出现次数计),初始为 |t|。
- 向右移动
right 扩张窗口:将 s[right] 对应的 need 计数减一;若减完后该字符的 need 仍 ≥ 0,说明它满足了 t 的部分需求,missing--。
- 当
missing == 0 时,说明当前窗口已经覆盖了 t 的所有字符,此时尝试收缩左端 left,在仍满足覆盖条件下尽量缩短长度,并记录当前最短答案。一旦收缩到去掉 s[left] 会使 need[s[left]] > 0,表明覆盖被破坏,停止收缩并继续扩张右端。
- 扫描结束后,若记录过答案则输出最短子串,否则输出空串。
开通会员即可查看完整视频题解: 1.题目讲解 2.思路分析 3.逐行代码手写