题目描述
思路解析动画文字版
记住「字符不重复就并入当前段,一旦重复就切一刀、清空集合另起一段」,下面每帧都在套它。
开局:还没读任何字符,当前段是空的,段数先记 1(最少也得有一段)。
扫到第 0 个字符 'a'。它不在当前段字符集里,加进来仍不重复,可以并入当前段。
把 'a' 放进集合(高亮行),当前段延长为 "a"。段数不变,继续往后扫。
扫到第 1 个字符 'b'。它不在当前段字符集里,加进来仍不重复,可以并入当前段。
把 'b' 放进集合(高亮行),当前段延长为 "ab"。段数不变,继续往后扫。
扫到第 2 个字符 'a',可它已经在当前段集合里了(高亮行)。当前段再装它就会重复,必须在这里切断。
切一刀:段数加到 2,集合清空,新的一段从 'a' 重新开始(蓝色是已切走的旧段,紫框是新段)。
扫到第 3 个字符 'c'。它不在当前段字符集里,加进来仍不重复,可以并入当前段。
把 'c' 放进集合(高亮行),当前段延长为 "ac"。段数不变,继续往后扫。
扫到第 4 个字符 'a',可它已经在当前段集合里了(高亮行)。当前段再装它就会重复,必须在这里切断。
切一刀:段数加到 3,集合清空,新的一段从 'a' 重新开始(蓝色是已切走的旧段,紫框是新段)。
扫到第 5 个字符 'b'。它不在当前段字符集里,加进来仍不重复,可以并入当前段。
把 'b' 放进集合(高亮行),当前段延长为 "ab"。段数不变,继续往后扫。
扫到第 6 个字符 'a',可它已经在当前段集合里了(高亮行)。当前段再装它就会重复,必须在这里切断。
切一刀:段数加到 4,集合清空,新的一段从 'a' 重新开始(蓝色是已切走的旧段,紫框是新段)。
扫到第 7 个字符 'c'。它不在当前段字符集里,加进来仍不重复,可以并入当前段。
把 'c' 放进集合(高亮行),当前段延长为 "ac"。段数不变,继续往后扫。
扫到第 8 个字符 'e'。它不在当前段字符集里,加进来仍不重复,可以并入当前段。
把 'e' 放进集合(高亮行),当前段延长为 "ace"。段数不变,继续往后扫。
整串扫完,一路切了 3 刀,得到 4 段:ab | ac | ab | ace,每段内部都没有重复字符。最少划分段数 = 4。
边界先想清:单字符为 1、全相同为 n、全不重复为 1。
面试重点:贪心正确性 + 可用位掩码把集合换成常数操作。
参考代码
class Solution: def partitionString(self, s: str) -> int: seen = set() ans = 1 for ch in s: if ch in seen: ans += 1 seen.clear() seen.add(ch) return ans复杂度
- 时间:O(n),每个字符只读一次
- 空间:O(1),集合最多装 26 个小写字母
易错点
面试追问把动画讲成自己的话
追问能不能不用集合,改用别的结构?
追问这题为什么贪心一定对?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
分发糖果
LeetCode 135 · 困难 · 沿着 贪心套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题