Hot100:分割回文串(Palindrome Partitioning)回溯 + 回文预处理 ACERS 解析

副标题 / 摘要 131. 分割回文串 的难点不是递归本身,而是两个问题要同时想清楚:当前切到了哪里,以及一个候选片段是不是回文。把这两件事拆开,你就能得到“回溯枚举 + 回文表预处理”的稳定写法。 预计阅读时长:15~18 分钟 标签:Hot100、回溯、字符串、回文、DP SEO 关键词:Palindrome Partitioning, 分割回文串, 回溯, 回文预处理, DP 元描述:通过 LeetCode 131 理解字符串分割型回溯与回文区间预处理,掌握“先判合法片段,再递归切后缀”的题目模型。 A — Algorithm(题目与算法) 题目还原 给定一个字符串 s,请把它切分成若干个子串,使得每个子串都是回文串,并返回所有可能的切分方案。 输入输出 名称 类型 描述 s string 只包含小写英文字母的字符串 返回 string[][] 所有合法的回文切分方案 示例 1 输入:s = "aab" 输出:[["a","a","b"],["aa","b"]] 示例 2 输入:s = "a" 输出:[["a"]] 约束 1 <= s.length <= 16 s 仅由小写英文字母组成 目标读者 已经学过 78/90 这类数组回溯,准备进入“字符串切分型回溯”的学习者 会写递归,但总把“切分位置”和“合法性检查”搅在一起的开发者 想掌握“先预处理合法区间,再枚举切分”的工程迁移套路的读者 背景 / 动机 这题非常适合帮你建立一种更通用的模型: 先判断哪些区间是合法片段,再递归地把整个串切完。 如果你只是把它看成“回文题”,容易只盯着 isPalindrome()。 但如果你把它看成“字符串分割题”,就会更清楚它的结构: ...

2026年4月19日 · 10 分钟 · map[name:Jeanphilo]

LeetCode 216:组合总和 III(回溯 / 固定长度搜索)ACERS 解析

副标题 / 摘要 216. 组合总和 III 给回溯再加了一条关键约束:不仅总和要命中,组合长度也必须恰好等于 k。这会把问题变成一个很干净的“固定长度组合搜索”。 预计阅读时长:12~15 分钟 标签:回溯、固定长度、剪枝、组合搜索 SEO 关键词:Combination Sum III, 组合总和 III, 固定长度回溯, k 个数, 剪枝, LeetCode 216 元描述:从题目本身推导 LeetCode 216 的稳定解法,真正理解固定长度 k、有界候选集 1..9 与只能使用一次的回溯模型。 A — Algorithm(题目与算法) 题目还原 找出所有满足条件的组合,使得: 从 1 到 9 中选数 一共恰好选 k 个数 这些数的和等于 n 每个数最多只能使用一次 返回所有可能的合法组合。 答案中不能包含重复组合,组合顺序不重要。 输入输出 名称 类型 描述 k int 需要选出的数字个数 n int 目标和 返回 int[][] 所有长度为 k 且和为 n 的合法组合 示例 1 输入:k = 3, n = 7 输出:[[1,2,4]] 示例 2 输入:k = 3, n = 9 输出:[[1,2,6],[1,3,5],[2,3,4]] 示例 3 输入:k = 4, n = 1 输出:[] 约束 2 <= k <= 9 1 <= n <= 60 目标读者 已经理解 39、40,现在准备继续叠加“长度必须恰好是 k”这个新约束的学习者 会写基本 DFS,但经常把“目标和”与“固定长度”混在一起判断的读者 想掌握固定长度组合搜索模板的开发者 背景 / 动机 这道题很适合作为 39 和 40 之后的下一题,因为它保留了回溯骨架,但搜索空间进一步收紧了: ...

2026年4月17日 · 7 分钟 · map[name:Jeanphilo]

LeetCode 40:组合总和 II(回溯 / 同层去重 / 只能用一次)ACERS 解析

副标题 / 摘要 如果说 39. 组合总和 教你“当前值还能继续用”,那 40. 组合总和 II 教你的就是下一层升级:数组里会出现重复值、每个位置只能用一次、去重必须发生在正确的树层上。 预计阅读时长:14~16 分钟 标签:回溯、去重、剪枝、组合搜索 SEO 关键词:Combination Sum II, 组合总和 II, 回溯, 同层去重, 剪枝, LeetCode 40 元描述:从题目本身一步一步推出 LeetCode 40 的稳定解法,真正理解排序、i + 1 递归和“同层去重”规则。 A — Algorithm(题目与算法) 题目还原 给定一个候选数组 candidates 和一个目标值 target, 找出所有和为 target 的不同组合,并以列表形式返回。 candidates 中的每个数字在每个组合里 最多只能使用一次。 最终答案中不能包含重复组合。 输入输出 名称 类型 描述 candidates int[] 候选数组,允许出现重复值 target int 目标和 返回 int[][] 所有和为 target 的不同组合 示例 1 输入:candidates = [10,1,2,7,6,1,5], target = 8 输出: [ [1,1,6], [1,2,5], [1,7], [2,6] ] 示例 2 输入:candidates = [2,5,2,1,2], target = 5 输出: [ [1,2,2], [5] ] 约束 1 <= candidates.length <= 100 1 <= candidates[i] <= 50 1 <= target <= 30 目标读者 已经做完 39. 组合总和,想继续搞清“不能重复选”之后模板怎么变的学习者 会写回溯框架,但一碰到输入里有重复值就容易写乱去重逻辑的读者 想真正掌握“同层去重”而不是硬背一句 if i > start and ... 的开发者 背景 / 动机 这道题是 39 的自然下一题,因为它同时改了两条规则: ...

2026年4月17日 · 8 分钟 · map[name:Jeanphilo]

试过 MemPalace 之后,我为什么仍然选择 docs-first workflow

一次真实试用后,我把 MemPalace 和现有 docs / issue / commit 工作流逐项对比,结论是:它适合保存聊天中的长期上下文,但不适合充当正式 source of truth。

2026年4月10日 · 3 分钟 · map[name:Jeanphilo]

Hot100:电话号码的字母组合(Letter Combinations of a Phone Number)固定层数 DFS ACERS 解析

副标题 / 摘要 这题表面上像字符串题,实质上是一个非常标准的固定层数回溯模型:第 k 层只处理第 k 个数字,从其映射字母里选一个,直到路径长度等于输入长度。 预计阅读时长:10~12 分钟 标签:Hot100、回溯、字符串、DFS SEO 关键词:Letter Combinations of a Phone Number, 电话号码的字母组合, 回溯, DFS 元描述:用 LeetCode 17 建立固定层数 DFS 模板,理解字符映射、路径长度终止与多语言实现。 A — Algorithm(题目与算法) 题目还原 给定一个仅由数字 2 到 9 组成的字符串 digits,返回它能表示的所有字母组合。 答案顺序不限。数字与字母的映射与电话按键一致,1 不对应任何字母。 输入输出 名称 类型 描述 digits string 由 2 到 9 组成的数字串 返回 string[] 所有可能的字母组合 示例 1 输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"] 示例 2 输入:digits = "2" 输出:["a","b","c"] 提示 1 <= digits.length <= 4 digits[i] 是范围 ['2', '9'] 内的一个数字 目标读者 已经掌握 78 / 46,准备看另一类回溯树形态的学习者 想把“每层处理一个位置”这种 DFS 模型固定下来的开发者 需要做编码扩展、短串生成、候选串组合的工程师 背景 / 动机 这题和子集、排列都不太一样。 ...

2026年4月2日 · 7 分钟 · map[name:Jeanphilo]

Hot100:全排列(Permutations)used[] 状态回溯模板 ACERS 解析

副标题 / 摘要 如果说子集题教你“组合型回溯”的骨架,那么全排列题教你的就是“状态型回溯”的核心:当前位置要选一个还没用过的元素,直到路径长度等于 n 才收集答案。 预计阅读时长:10~12 分钟 标签:Hot100、回溯、全排列、DFS SEO 关键词:Permutations, 全排列, 回溯, used, DFS 元描述:通过 LeetCode 46 固定排列型回溯模板,重点理解 used[]、叶子收集与多语言实现。 A — Algorithm(题目与算法) 题目还原 给定一个不含重复数字的数组 nums,返回它的所有可能全排列。 答案顺序不限。 输入输出 名称 类型 描述 nums int[] 不含重复元素的整数数组 返回 int[][] 所有可能的全排列 示例 1 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2 输入:nums = [0,1] 输出:[[0,1],[1,0]] 示例 3 输入:nums = [1] 输出:[[1]] 提示 1 <= nums.length <= 6 -10 <= nums[i] <= 10 nums 中所有整数互不相同 目标读者 已经做完 78. 子集,准备进入排列型回溯的学习者 会写递归,但状态恢复经常出错的开发者 需要枚举任务执行顺序、测试顺序或操作序列的工程师 背景 / 动机 排列问题和组合问题最本质的区别是: ...

2026年4月2日 · 6 分钟 · map[name:Jeanphilo]

Hot100:组合总和(回溯 / 剪枝 / 可重复选取)ACERS 解析

副标题 / 摘要 组合总和是 Hot100 回溯阶段里第一道真正把“组合模板 + 目标约束 + 排序剪枝”揉在一起的题。你不应该直接背结论,而应该顺着问题一步步推出:为什么要有 path,为什么要有 remain,为什么下一层仍然从 i 开始。 预计阅读时长:14~16 分钟 标签:Hot100、回溯、组合、剪枝 SEO 关键词:Combination Sum, 组合总和, 回溯, 剪枝, remain, DFS 元描述:通过 LeetCode 39 建立组合型回溯加剪枝模板,理解可重复选取、remain 语义与排序后的安全剪枝。 A — Algorithm(题目与算法) 题目还原 给定一个无重复元素的整数数组 candidates 和一个目标整数 target, 找出 candidates 中所有可以使数字和为 target 的不同组合,并以列表形式返回。 你可以无限次选取同一个候选数字。 如果两个组合中某个数字出现次数不同,则它们被视为不同组合。 输入输出 名称 类型 描述 candidates int[] 无重复元素的候选数组 target int 目标和 返回 int[][] 所有和为 target 的不同组合 示例 1 输入:candidates = [2,3,6,7], target = 7 输出:[[2,2,3],[7]] 示例 2 输入:candidates = [2,3,5], target = 8 输出:[[2,2,2,2],[2,3,3],[3,5]] 示例 3 输入:candidates = [2], target = 1 输出:[] 约束 1 <= candidates.length <= 30 2 <= candidates[i] <= 40 candidates 中所有元素互不相同 1 <= target <= 40 官方保证满足条件的不同组合数少于 150 目标读者 已经做过 78. 子集,现在准备学习“带目标约束”的回溯写法 知道回溯大概长什么样,但一碰到“数字可重复选取”就容易写错边界的学习者 想把这题真正写成模板,而不是只记住 dfs(i, remain - x) 这一行的开发者 背景 / 动机 39. 组合总和 很适合作为回溯第二阶段的训练题,因为它让你同时处理三件事: ...

2026年4月2日 · 8 分钟 · map[name:Jeanphilo]

先写骨架,再补细节:用契约拆解算法题与中型程序

围绕“公开接口先行、helper 以契约占位、实现围绕不变量展开”这条主线,系统讲解如何从算法题过渡到中型程序设计,并用 LRUCache 与下单流程示例说明它和 DDD 的分工关系。

2026年3月20日 · 8 分钟 · map[name:Jeanphilo]

克隆图:哈希表 + DFS/BFS 实现无向图深拷贝(LeetCode 133)

副标题 / 摘要 Clone Graph 不是单纯的图遍历题,而是“带环对象图的深拷贝”题。真正的关键不是能不能走完图,而是如何保证每个原节点只克隆一次,并且所有边都指向克隆图中的新节点。 预计阅读时长:12~15 分钟 标签:图、DFS、BFS、哈希表、深拷贝 SEO 关键词:克隆图, Clone Graph, 图深拷贝, LeetCode 133, DFS, BFS 元描述:通过“原节点 -> 新节点”映射表实现无向图深拷贝,讲清 DFS/BFS、环处理、复杂度与多语言代码。 目标读者 刷 LeetCode 图论题、希望掌握“深拷贝 + visited/map”模板的学习者 需要复制对象图、工作流图、拓扑结构的工程师 经常在“图遍历”和“对象复制”之间混淆的开发者 背景 / 动机 很多同学第一次做这题,会把它当成普通遍历题: DFS 一遍 BFS 一遍 把值抄过去 但真正难点在于: 图里可能有环 同一个节点可能从多条路径访问到 复制出来的新图,所有邻居必须指向“新节点”,不能混入旧节点引用 所以这题本质上是: 带环对象图的深拷贝问题 这类模式在工程里也很常见: 复制流程编排图 克隆编辑器里的节点网络 复制依赖关系图做快照 核心概念 深拷贝:返回的新图里每个节点都必须是新建对象 节点身份:判断“是不是同一个节点”看的是对象身份 / 引用,不只是 val 邻接关系保持:新图的边结构必须与原图完全一致 映射表:原节点 -> 克隆节点,既防止死循环,也防止重复创建 A — Algorithm(题目与算法) 题目重述 给定一个无向连通图中某个节点 node 的引用,请返回这个图的深拷贝。 每个节点结构如下: class Node { public int val; public List<Node> neighbors; } 题目测试用例使用邻接表表示图。 如果图不为空,给定节点总是值为 1 的节点。 ...

2026年3月19日 · 5 分钟 · map[name:Jeanphilo]

Hot100:二叉树的层序遍历(Binary Tree Level Order Traversal)BFS / DFS ACERS 解析

副标题 / 摘要 层序遍历是二叉树 BFS 模板的起点。真正关键的不是“用队列”,而是“如何把同一层的节点切分出来”。本文按 ACERS 结构拆解 LeetCode 102 的按层处理方法、DFS 深度分桶备选方案,以及工程里常见的分层遍历场景。 预计阅读时长:10~12 分钟 标签:Hot100、二叉树、BFS、DFS、队列、层序遍历 SEO 关键词:Hot100, Binary Tree Level Order Traversal, 二叉树的层序遍历, BFS, 队列, LeetCode 102 元描述:系统讲透 LeetCode 102 的层序 BFS、层宽控制与 DFS 深度分桶思路,并延伸到组织树、菜单树和波次执行等工程场景。 目标读者 想把 BFS 模板真正固定下来的 Hot100 刷题读者 会普通遍历,但一到“按层输出”就容易把层边界写乱的开发者 需要按深度分组展示树形结构的工程师 背景 / 动机 LeetCode 102 是树题里最标准的 BFS 入门题之一。 它训练的不是“遍历所有节点”,而是两件更重要的事: 如何用队列维护“下一批待处理节点” 如何准确切出“这一层”和“下一层”的边界 很多 BFS bug 都来自这里: 在遍历当前层时直接用不断变化的 queue.length 一边弹当前层,一边把新孩子混进当前层结果 忘记空树处理,导致访问空指针 把 102 的模板写稳,后面的: 右视图 每层平均值 锯齿层序遍历 最小深度 / 最大深度的 BFS 写法 都会自然很多。 ...

2026年3月15日 · 8 分钟 · map[name:Jeanphilo]