题目描述
思路解析动画文字版
直接用逗号拼接会被字符串里的逗号骗到。
每个字符串前写长度和分隔符,解码时先读长度,再按长度切片。
① 编码:每个串写成「长度#内容」:编码核心:在每段前面放「长度 + #」,告诉解码器这段有多长。
② 首尾拼成一条:2#hi3#abc:拼接后无需逗号分隔——长度前缀自带边界信息。
③ 解码 step1:从 i=0 读数字到 #,得 len=2:先读长度:一直读数字直到遇见 #。
④ 解码 step2:从 # 后取 2 个字符 → "hi",i 跳到 4:按长度精确切 len 个字符,再把指针挪到下一段。
⑤ 重复读出 abc → 还原 [hi,abc]:循环「读长度→切内容→跳指针」,直到字符串读完。
一句话记住:每个字符串前写长度和分隔符,解码时先读长度,再按长度切片。
边界三连:本题真边界:空数组、空串、内容含 #。
⑥ 雷区:为什么不能用逗号/分隔符直接拼?:分隔符会和内容撞车;长度前缀读固定个数,永不歧义。
面试追问 · 核心思路:思路:编码写 长度#内容 拼接;解码读长度再切 len 个字符。
面试追问 · 为何不用分隔符:内容可能含任意字符,分隔符会撞车,长度前缀才安全。
面试追问 · 复杂度:复杂度:编解码各 O(N),N 为总字符数。
这题学完不要乱跳,下一步去对应专题 /leetcode-animation/ds?k=hashtable 连刷同类题;卡住时用 AI 答疑问“长度前缀为什么对任意字符都安全”。
参考代码
class Codec: def encode(self, strs): return "".join(f"{len(s)}#{s}" for s in strs) def decode(self, s): ans, i = [], 0 while i < len(s): j = s.find("#", i); size = int(s[i:j]) ans.append(s[j+1:j+1+size]); i = j + 1 + size return ans复杂度
- 时间复杂度:O(n),编码、解码各扫一遍全部字符 N
- 空间复杂度:O(n),输出字符串与原文等长
可套用的代码模板
记牢:编码 len#内容 拼接;解码读 # 前长度、切 len 个、跳指针、循环。
Python
# 长度前缀 编码/解码 骨架def encode(strs): return "".join(f"{len(s)}#{s}" for s in strs)def decode(s): res, i = [], 0 while i < len(s): j = s.index("#", i) # 找到长度后的 # length = int(s[i:j]) # 读出长度 res.append(s[j+1 : j+1+length]) # 切 length 个字符 i = j + 1 + length # 跳到下一段 return res易错点
面试追问把动画讲成自己的话
追问整体思路是什么?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
除自身以外数组的乘积
LeetCode 238 · 中等 · 沿着 数组 & 哈希 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题