题目描述
思路解析动画文字版
记住这条链:长度 → # → 内容。读的时候先拿长度,再照长度切,永远不会切错。下面把 3#abc2#de1#f 一格一格演给你看。
编码第 1 个词 "abc":它有 3 个字符,先把长度 3 写到结果里(绿色这格)。
紧跟着写一个 #,把「长度」和「内容」隔开(界碑作用)。现在结果里有了 3# 这个开头。
最后把词 "abc" 原样接在 # 后面。这个词编码成 3#abc,整段已写进结果(绿色这片)。
编码第 2 个词 "de":它有 2 个字符,先把长度 2 写到结果里(绿色这格)。
紧跟着写一个 #,把「长度」和「内容」隔开(界碑作用)。现在结果里有了 2# 这个开头。
最后把词 "de" 原样接在 # 后面。这个词编码成 2#de,整段已写进结果(绿色这片)。
编码第 3 个词 "f":它有 1 个字符,先把长度 1 写到结果里(绿色这格)。
紧跟着写一个 #,把「长度」和「内容」隔开(界碑作用)。现在结果里有了 1# 这个开头。
最后把词 "f" 原样接在 # 后面。这个词编码成 1#f,整段已写进结果(绿色这片)。
编码完成:["abc","de","f"] 变成一整条字符串 "3#abc2#de1#f"。下面演相反的过程——把它拆回来。
指针 i 走到下标 0。先读 # 之前的数字,那就是下一个词有多长。
# 之前的数字是 3,所以下个词长 3 个字符。下标 1 的 # 是界碑,跳过它,从下标 2 开始截内容。
从 # 后面照长度 3 截取,截出的 "abc" 就是一个完整原词(绿色这片)。把它加进结果列表。
这个词读完了,指针 i 直接跳到下标 5,重复同样的「读长度→跳#→按长度截」。
指针 i 走到下标 5。先读 # 之前的数字,那就是下一个词有多长。
# 之前的数字是 2,所以下个词长 2 个字符。下标 6 的 # 是界碑,跳过它,从下标 7 开始截内容。
从 # 后面照长度 2 截取,截出的 "de" 就是一个完整原词(绿色这片)。把它加进结果列表。
这个词读完了,指针 i 直接跳到下标 9,重复同样的「读长度→跳#→按长度截」。
指针 i 走到下标 9。先读 # 之前的数字,那就是下一个词有多长。
# 之前的数字是 1,所以下个词长 1 个字符。下标 10 的 # 是界碑,跳过它,从下标 11 开始截内容。
从 # 后面照长度 1 截取,截出的 "f" 就是一个完整原词(绿色这片)。把它加进结果列表。
扫到末尾,整条字符串拆成了 ["abc", "de", "f"],和编码前一模一样。靠长度切片,原文里就算有 # 也不会拆错。
三个高频追问:为什么不用符号分隔、多位长度、空串边界——都靠「长度精确切片」化解。
参考代码
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) # 找长度后的 # size = int(s[i:j]) # # 前是长度 res.append(s[j+1:j+1+size])# 按长度截取 i = j + 1 + size # 跳到下一段 return res复杂度
- 时间:O(n),n 是编码串总长度;编码和解码都只把字符顺扫一遍
- 空间:O(n),结果字符串/列表的长度与输入总字符数同阶,无额外开销
易错点
面试追问把动画讲成自己的话
追问为什么不直接用逗号或空格分隔每个词?
追问长度是多位数(比如 12#…)会出问题吗?
追问空字符串怎么编码?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
除自身以外数组的乘积
LeetCode 238 · 中等 · 沿着 数组 & 哈希 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题