字符串模拟与中心扩散:从边界处理到最长回文子串
字符串模拟与中心扩散这是我刷算法题多年后依然觉得最值得反复琢磨的两个主题。一个负责应对那些看似繁琐、实则考验代码控制力的场景一个负责在回文类问题里四两拨千斤。很多同学觉得字符串题目简单无非是扫描、比较、拼接但真到了笔试或者项目里处理日志、解析协议时才发现“模拟”两个字背后全是细节。中心扩散则更像一门巧劲把暴力枚举的浪费砍半用最朴素的对称性思维解决复杂问题。这篇文章不打算给你堆一堆华丽架构只聊两件事的核心原理、完整实现和踩坑记录。适合正在备战的求职者、准备竞赛的学生以及工作中需要处理字符串逻辑的开发者。我会把自己实际写过的代码、真实的调试过程、以及那些反复让人头疼的边界问题都摊开讲尽量让新手也能跟着一步步复现。1. 字符串模拟——看似简单处处陷阱1.1 字符串模拟题的本质是什么字符串模拟题本质上是一道“翻译题”把人类的直观规则翻译成计算机能逐步执行的指令。它不依赖复杂的数学推导也不依赖高性能的数据结构核心考察的是你对字符串底层存储的理解以及你在写循环时能不能把所有分支都想清楚。我见过太多人把这类题归为“水题”结果一到手写代码就翻车。比如写一个字符串压缩把aabcccccaaa变成a2b1c5a3听起来是不是很简单但真动手写就会发现你至少需要回答这么几个问题当前字符跟上一个字符相同吗相同是继续计数还是立刻拼接字符串到达末尾时最后一组字符还能不能正常写入如果原字符串压缩后没有变短该返回什么这些都不是算法层面的难题但每一个都能让粗心的人栽跟头。所以好用的模拟代码往往不是一次写对的而是靠边界测试用例反复打磨出来的。我习惯把字符串模拟题看作“代码控制力训练场”而不是“送分题”态度一端正后面的细节自然就盯得住了。1.2 一个从零开始的模拟题完整拆解就拿上面提到的字符串压缩来举例。题目描述通常是这样给定一个字符串把连续出现的相同字符压缩成“字符出现次数”的形式比如aabcccccaaa压缩为a2b1c5a3。如果压缩后的字符串长度不小于原字符串则返回原字符串。先理一下思路。我们需要一个结果容器一个计数器还有一个“当前正在统计的字符”的参考值。逐字符扫描时如果遇到不同的字符就把上一个字符连同次数追加到结果里重置计数器如果相同就计数器加一。最后别忘了处理最后一组字符因为循环结束时它还没有被写入。用 Python 实现大概是这个样子def compress_string(s: str) - str: if not s: return s res [] count 1 cur s[0] for i in range(1, len(s)): if s[i] cur: count 1 else: res.append(cur) res.append(str(count)) cur s[i] count 1 res.append(cur) res.append(str(count)) compressed .join(res) return compressed if len(compressed) len(s) else s这段代码的核心在于cur记录当前统计的字符count记录它的出现次数。一旦发现新字符立刻把旧字符和次数输出然后重置状态。我在第一次写类似代码时常常忘记循环外的那两次append结果最后一段连续字符永远丢在末尾这就是典型的“末尾处理遗漏”。另外注意返回值的条件。题目说“如果压缩后的字符串长度不小于原字符串则返回原字符串”意味着只有压缩真正变短时才用压缩结果。这个条件不能省否则会挂掉aabbccdd这类输入——压缩成a2b2c2d2之后长度一样按规则应当返回原串。1.3 四个最容易踩的坑字符串模拟题的错误翻来覆去也就那么几类我踩过之后专门记了一张清单。第一个坑是索引越界尤其是在循环里访问i1或i-1时只要稍不留意就会越界安全的做法是提前在判断条件里加上长度限制或者用for i in range(1, len(s))这种天然避开首尾问题的写法。第二个坑是修改字符串后长度变化。在 Python 这类不可变字符串的语言里问题还不大但在 C 或 Java 里如果你边遍历边原地修改循环的终止条件和索引就会错乱。我的建议是模拟题里先构建新结果不要试图在原地优雅修改除非题目明确要求O(1)空间。第三个坑是计数和字符的拼接顺序。很多人会写出count char而不是char count尤其是多语言切换时一时忘了字符串拼接的顺序。解决办法很简单拿a2b2这种标准输出比对一下就一目了然。第四个坑是空串和单字符。空串直接返回空串单字符的话压缩结果是a1如果题目要求压缩后长度不小于原串就返回原串那a就不能变成a1因为它变长了。这两种特殊情况必须在代码开头单独处理否则后面全乱套。说到底模拟题的高分秘诀就是先把特殊情况写完再写主循环最后统一检查边界。2. 中心扩散法——以巧破力的经典2.1 中心扩散背后的数学直觉如果说字符串模拟是“硬功夫”那中心扩散就是“巧劲”。它的目标非常明确高效解决回文子串相关的问题尤其是最长回文子串。回文串的特点是“左右对称”。最朴素的做法是枚举所有子串再逐个判断是否对称总复杂度是O(n^3)在长度稍大的字符串上根本跑不动。动态规划可以把时间复杂度压到O(n^2)但它需要开一张二维表空间也是O(n^2)。而中心扩散的思路是把“判断整个子串是否回文”这件事换成“从一个中心点向两边扩展看能扩多远”每次扩展操作是O(1)的总复杂度降到了O(n^2)空间则只有O(1)。为什么中心扩散能做到这点因为任何一个回文串都能找到一个对称中心。这个中心有两种形态一种是单个字符比如aba的中心是b另一种是两个相邻字符的中间位置比如abba的中心是bb之间的空隙。只要把每个可能的中心都试一遍并向两侧扩展开去就能覆盖所有回文子串。2.2 最长回文子串的完整实现直接上代码还是用 Python这个思路的实现非常简洁def longest_palindrome(s: str) - str: if not s or len(s) 1: return start, end 0, 0 for i in range(len(s)): len1 expand_around_center(s, i, i) len2 expand_around_center(s, i, i 1) max_len max(len1, len2) if max_len end - start: start i - (max_len - 1) // 2 end i max_len // 2 return s[start:end 1] def expand_around_center(s: str, left: int, right: int) - int: while left 0 and right len(s) and s[left] s[right]: left - 1 right 1 return right - left - 1第一处需要解释的是expand_around_center的返回值。当循环终止时left和right已经越过了合法边界此时回文串的长度应该是(right - 1) - (left 1) 1化简后就是right - left - 1。这一步很多人看不懂其实拿一个例子手推一遍就通了。比如找aba以b为中心的回文初始left1, right1匹配成功后退成left0, right2仍匹配再退成left-1, right3此时退出循环返回3 - (-1) - 1 3正是aba的长度。第二处是start和end的更新公式。当回文长度为max_len且中心为i时左边界是i - (max_len - 1) // 2右边界是i max_len // 2。比如max_len3, i1左边界是1 - 1 0右边界是1 1 2再如max_len4, i1左边界是1 - 1 0右边界是1 2 3。奇数长度和偶数长度的公式略有差异但被整除运算巧妙地统一了。2.3 动态规划、中心扩散与 Manacher 的三方对比很多人会困惑动态规划也能解最长回文子串为什么不直接用我的经验是看场景。方法时间复杂度空间复杂度优点缺点暴力枚举O(n^3)O(1)思路直白数据稍大就超时动态规划O(n^2)O(n^2)便于扩展其他回文类问题二维数组占用大中心扩散O(n^2)O(1)实现简单空间最省数据极大时仍不够快ManacherO(n)O(n)理论最优实现复杂度高面试或者笔试时我最推荐中心扩散。它比暴力快得多比动态规划省空间比 Manacher 好写得多。只有在字符串长度达到十万、百万级别或者你明确知道题目卡了时间复杂度才去考虑 Manacher。我还习惯在做题时先写中心扩散版本作为保底如果测试数据真的过大再考虑优化。这个策略帮我避免了很多“卡在实现细节上”的尴尬。3. 细节决定成败——把边界当朋友3.1 回文判断中的细节清单回文类题目最折磨人的地方永远是那几处细节。我把它们整理成自己的检查清单每次提交前都会在心里过一遍。第一奇数长度与偶数长度的中心区别。中心扩散时一个中心对应(i, i)两个中心对应(i, i1)如果少算了后者abba这类偶数长度的回文就会漏掉。我犯过好几次这种错误后来养成了习惯写中心扩散第一件事就是确认两种中心都调用了。第二扩散停止条件。while循环里必须同时检查左边界和右边界是否越界顺序是先查边界再查字符相等否则数组下标直接越界。常见写法是while left 0 and right len(s) and s[left] s[right]:这个写法把顺序固定死了不容易出错建议直接背下来用。第三区间开闭。如果用[start, end]表示回文区间那么 Java 里substring(start, end 1)才能取到完整回文串end本身要加一。如果用半开区间[start, end)那substring(start, end)就正确了。语言不同API 的区间定义也不同代码写完之后立刻拿小例子跑一遍远比事后调试省力。3.2 字符串题常见错误速查表写多了字符串题我总结出一张错误速查表每次卡住的时候对照着查基本都能找到问题所在。错误类型典型场景解决思路空串未处理输入时程序报错函数开头统一判空长度判断错误用len(s)-1却写成len(s)-2循环前手推一个三字符样例中心枚举遗漏只考虑奇数长度回文两种中心都要试越界访问s[i1]在循环尾越界缩小循环范围或加and条件原地修改引发错乱边遍历边删除字符先构建新字符串再统一替换大小写与数字题目要求忽略大小写却没处理先lower()或upper()字符类型判断要求只考虑字母数字却忽略了标点用isalnum()之类 API 预过滤这张表我贴在笔记软件里已经很多年了。它的价值不在于每一条都深奥而在于提醒我字符串题的错误不是“没想到”而是“没查表”。3.3 从“会做”到“做快”的提速技巧掌握了边界之后下一步是“做快”。这里的做快不是指代码运行得快而是指你在考场上或笔试中能快速写出正确无误的版本。我常用的提速技巧有三个。第一个是“先判空、再判单字符”把最特殊的情况直接消灭在入口处主流程就清爽很多。第二个是“把核心逻辑拆成独立小函数”比如上面的expand_around_center它被调用两次如果不拆出来主函数里就会混杂两次几乎一样的循环可读性差也更容易写错。第三个是“提交前用一个手动构造的用例走一遍”例如s babad我会先在草稿纸上写下预期输出bab再在心里按代码逻辑走一遍确认没有逻辑漏掉。这些技巧看上去琐碎但它们就是“会做”和“做快”之间那层窗户纸。很多同学代码写得慢不是因为打字慢而是因为写了改、改了删没有一套固定的代码骨架。字符串题的骨架其实就那几类中心扩散一套双指针一套模拟状态机一套熟了之后自然行云流水。4. 三道实战题透底演练4.1 实战一最长回文子串——三种写法对比题目给定一个字符串s找到其中最长的回文子串。我分别用暴力、动态规划、中心扩散各写了一次测试数据是长度 1000 的随机字符串。暴力的结果是超时动态规划和中心扩散都能通过但动态规划申请了一个 1000×1000 的布尔矩阵内存占用接近 1MB而中心扩散几乎没有额外空间。这里我贴一下动态规划与中心扩散的代码大家可以直接对照着看差异。动态规划版def longest_palindrome_dp(s: str) - str: n len(s) if n 2: return s dp [[False] * n for _ in range(n)] start, max_len 0, 1 for i in range(n): dp[i][i] True for L in range(2, n 1): for i in range(n - L 1): j i L - 1 if s[i] ! s[j]: dp[i][j] False else: if L 2: dp[i][j] True else: dp[i][j] dp[i 1][j - 1] if dp[i][j] and L max_len: max_len L start i return s[start:start max_len]动态规划的思路是一个子串回文当且仅当两端字符相等且内部子串也回文。这里的关键是L从小到大枚举区间长度保证递推时dp[i1][j-1]已经计算过。两种方法都能过题但如果空间受限中心扩散明显更轻量。4.2 实战二字符串反转中的模拟思维题目反转字符串中的单词顺序比如the sky is blue变成blue is sky the。这题看起来简单但它考的是对空格、首尾空格、连续空格的处理能力。如果直接调 API很多语言一行就搞定了但为了体现模拟功底我建议手写一遍双指针版本。def reverse_words(s: str) - str: words [] i 0 n len(s) while i n: while i n and s[i] : i 1 if i n: break j i while j n and s[j] ! : j 1 words.append(s[i:j]) i j return .join(words[::-1])这段代码的核心在嵌套循环。外层循环负责遍历字符串第一个内层循环跳过空格找到单词起点第二个内层循环在遇到空格时停下拿到完整单词。很多人写错的地方在于“跳过空格时忘记检查越界”或者在s[i:j]切出后没有及时把i更新为j导致死循环。这道题其实也是模拟题——模拟一个“按空格切分”的过程。可见字符串模拟的思想并不局限于纯手工的字符拼接也渗透在一切需要逐字符处理的题目里。4.3 实战三压缩字符串——模拟与状态机再回到字符串压缩但它有一个更硬核的版本要求原地修改字符数组并返回新长度。比如输入[a,a,b,b,c,c,c]输出 6并且数组前 6 位变成[a,2,b,2,c,3]。原地版本比上一版的挑战大了不少因为你要在一个数组里边读边写还要避免覆盖未读的数据。我的做法是用一个写指针write和一个读指针read同时遍历数组read负责找连续字符的边界write负责在左侧填写压缩结果。def compress(chars: List[str]) - int: write 0 read 0 n len(chars) while read n: char chars[read] count 0 while read n and chars[read] char: read 1 count 1 chars[write] char write 1 if count 1: for digit in str(count): chars[write] digit write 1 return write它的巧妙之处在于read只前进不后退所以即使写入覆盖了左侧的位置也永远不会干扰到右侧还没读到的数据。写指针和读指针重叠时chars[write] char其实写的就是当前位置但那时当前位置已经被read读过了所以完全安全。如果你把这道题跟状态机的概念联系起来会发现它就像一个很轻量的状态机当前状态是“正在读哪个字符”一旦字符变化就触发一次“输出切换状态”的动作。模拟题遇到复杂规则时用状态机的视角去看思路会清晰很多。4.4 排查问题实录三个真实调试场景调试过程中我遇到过三个比较典型的问题。第一个是死循环。场景是反转单词的双指针版本i在跳过空格时没有更新导致外层while永远在同一个位置打转。排查方法很老套在循环开头打印i和j的值立刻就能发现i根本没动。此后我养成了一个习惯只要写了嵌套循环先确认内层循环是否具备“必定让外层变量前进”的结构。第二个是结果少一位字符。场景是压缩字符串的非原地版本忘记在循环外追加最后一组字符导致末尾的aaa直接消失。测试用例用的是aabbb期望输出a2b3实际输出却是a2。这种问题只有靠边界用例才能暴露所以我每次都会特意用“末尾连续字符最长”的输入来测。第三个是起始索引错位。场景是中心扩散求最长回文更新start时把(max_len - 1) // 2写成了max_len // 2结果奇数长度回文的起始位置整体左移了一位。测试babad时得到bab还好但测cbbd时得到bb也没问题只有测abcba这类以中间为对称轴的长串时才发现回文串的内容错误。说到底数组下标公式这种枯燥的东西必须拿具体数值逐项代入不能只靠眼力。5. 我的体会与后续扩展5.1 个人心得为什么这类题值得反复做字符串模拟与中心扩散都算不上高深算法但它们有一个共同点贴近真实工程场景。日常开发里处理用户输入、解析日志、做文本清洗全都在跟字符串搏斗。能把字符串题写得干净利落的人写业务逻辑时通常也不会太差。我自己的感觉是这类题特别适合用来训练“分层思考”的能力先想边界再想主流程最后想异常。这套思维方法一旦形成不仅用于算法题也用于设计函数、排查线上问题。很多调试能力强的人并不是天生细心而是他们把“边界”放在了思考的第一顺位。5.2 再往前走一步从中心扩散到 Manacher中心扩散虽然已经很好用但还有更快的解法——Manacher 算法。它把时间复杂度压到O(n)核心是维护一个当前已知的最右回文边界利用对称性跳过已经计算过的区间。这个算法初看很难懂可是理解了中心扩散之后再去学你会明显感觉轻松很多因为 Manacher 本质上是在中心扩散的基础上做了“信息复用”。如果你备战的是高强度竞赛准备一份 Manacher 模板是有必要的如果只是常规面试中心扩散已经完全够用。建议顺序是先把中心扩散写成肌肉记忆再花一天时间阅读 Manacher 的原理。不要跳级原因很简单——Manacher 里的小细节比中心扩散多得多连边界公式都需要仔细推导没有基础直接学容易劝退。5.3 最后一招百试百灵的调试习惯最后分享一个调试小技巧字符串题的用例一定要包含这几种类型——空串、单字符、全相同字符、全不同字符、回文串、非回文串、带连续空格的长文本。每一类用例都可能踩中不同的边界所以我会在代码文件的注释里固定放一组测试样例每次写完先跑它们再跑平台上的隐藏用例。这些测试样例看起来朴素但真的能帮我避免大多数低级错误。字符串模拟与中心扩散一个练的是刚猛稳健一个练的是灵巧通透两者结合几乎可以覆盖所有常见字符串题目的核心考法。希望这篇分享能让你少走一些弯路把这些题目真正握在手心里。

相关新闻

最古老“屁股印痕”:远古节肢动物腹面压痕化石的识别与解读

最古老“屁股印痕”:远古节肢动物腹面压痕化石的识别与解读

“最古老‘屁股’印痕化石”——我第一次看到这个标题的时候先是被逗笑了,但紧接着就意识到,这其实是古生物圈里相当硬核的一类发现被翻译成了大众能听懂的说法。所谓“屁股印痕”,准确讲是远古节肢动物的腹面压痕化石,常见的是尾…

2026/10/15 5:33:21 阅读更多 →
RKE配置文件详解:从集群部署到生产运维实战

RKE配置文件详解:从集群部署到生产运维实战

1. 为什么要用RKE:从裸机到K8s集群怎么选型1.1 RKE是什么,和kubeadm的核心差异如果你已经啃完了Kubernetes的基础概念,正准备把手上的服务器拉起来一个真正的集群,那么Kubernetes集群部署这个环节,大概率是你绕不开的一…

2026/10/15 5:33:21 阅读更多 →
微信登录报错10003排查:域名白名单配置与回调地址规范

微信登录报错10003排查:域名白名单配置与回调地址规范

说实话,微信登录报错10003这个坑,几乎每个接微信登录的团队都至少踩一遍。现象特别简单:用户在网页里点了“微信登录”,照理说应该跳到微信的授权确认页,结果要么弹出一个白底黑字的错误提示,要么后台日志里…

2026/10/15 5:33:21 阅读更多 →

最新新闻

CentOS 7.6搭建DNS正向解析服务:BIND配置实战

CentOS 7.6搭建DNS正向解析服务:BIND配置实战

平时做运维的朋友肯定都有过这种经历:公司内部新起了一套系统,IP地址越来越多,今天要连这个、明天要连那个,总不能天天翻Excel表格。更尴尬的是,内网服务想用一个好记的域名访问,结果发现公共DNS根本不认识…

2026/10/15 7:37:59 阅读更多 →
ConcurrentHashMap 1.7与1.8源码对比:从Segment到CAS+synchronized的并发演进

ConcurrentHashMap 1.7与1.8源码对比:从Segment到CAS+synchronized的并发演进

做Java开发的朋友,多少都被ConcurrentHashMap“教育”过。面试要问,源码分析要讲,线上排查高并发问题也绕不开它。而只要一聊到源码,1.7和1.8这两个版本的区别就是永远躲不开的坎:一个是Segment分段锁,一个…

2026/10/15 7:37:59 阅读更多 →
WinForm文本编辑器源码解析与高级功能扩展实战指南

WinForm文本编辑器源码解析与高级功能扩展实战指南

简介:这份C#文本/代码编辑器专题文档,面向具备一定C#基础、想从零构建或二次开发编辑器的研发人员,解决从界面搭建、文件操作到功能扩展各环节的关键问题。文档先讲解基于WinForm与RichTextBox的基础实现,包括字体加粗/斜体/下划线…

2026/10/15 7:37:59 阅读更多 →
微信小程序投票系统怎么从零搭建?以活动评选为例的完整流程

微信小程序投票系统怎么从零搭建?以活动评选为例的完整流程

从技术视角看,在微信生态里"创建一个投票活动",本质是配置一套活动数据结构 报名审核状态机 防刷策略 数据导出能力。本文以「活动评选」场景为例,梳理从创建到发布的完整流程,并以投票帮小程序作为落地实践案例。 …

2026/10/15 7:37:59 阅读更多 →
T型三电平逆变器VSG自适应控制与并离网切换优化

T型三电平逆变器VSG自适应控制与并离网切换优化

1. 项目背景与核心价值电力电子变换器在新能源发电系统中扮演着关键角色,而T型三电平逆变器因其高效率、低损耗的特性,在中大功率场合得到广泛应用。传统逆变器控制策略在并离网切换过程中常面临暂态冲击大、同步性能差等问题,这正是虚拟同步…

2026/10/15 7:37:59 阅读更多 →
软件的本质是行为:REA式行为克隆全流程拆解与实操复盘

软件的本质是行为:REA式行为克隆全流程拆解与实操复盘

说真的,看到“REA三天狂揽12万星”那条标题的时候,我第一反应是:这又是标题党?一个Agent,不用源码就能克隆一切软件,听起来太像营销号编出来的故事。但等我顺着链接把演示看完,又拿自己手头一个…

2026/10/15 7:36:59 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →