AlgoNote 题解:LeetCode 0424「替换后的最长重复字符」——不定长滑动窗口 + 频数统计的经典实战
教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载本篇题解基于 AlgoNote 仓库的 0424. 替换后的最长重复字符 文档展开系统讲解如何用「不定长滑动窗口 字符频数统计」把 O(n³) 的暴力枚举优化到 O(n)。读完你将掌握滑动窗口最核心的「窗口合法性判定」技巧窗口长度 - 窗口内最大字符频数 ≤ k并能直接迁移到「最多替换 K 次使区间内元素一致」这一类问题如 LeetCode 1004的求解。题目信息题目编号0424LeetCode 424题目链接0424. 替换后的最长重复字符 - 力扣标签哈希表、字符串、滑动窗口难度中等题目大意描述给定一个仅由大写英文字母组成的字符串s以及一个整数k。可以将任意位置上的字符替换成另外的大写字母最多可替换k次。要求在进行上述操作后找到包含重复字母的最长子串长度。说明数据范围1 ≤ s.length ≤ 10^5s仅由大写英文字母组成0 ≤ k ≤ s.length示例 1输入s ABAB, k 2 输出4 解释用两个A替换为两个B,反之亦然。示例 2输入s AABABBA, k 1 输出4 解释 将中间的一个A替换为B,字符串变为 AABBBBA。 子串 BBBB 有最长重复字母, 答案为 4。 可能存在其他的方法来得到同样的结果。先看暴力解法为什么 O(n³) 会超时暴力求法的思路很直观枚举字符串s的所有子串对于每一个子串统计子串中出现次数最多的字符替换除它以外的字符k次维护最长子串的长度。但这样做的代价极高枚举子串的时间复杂度为 O(n²)统计出现次数最多的字符和替换字符的时间复杂度为 O(n)且两者属于平行处理总体时间复杂度为 O(n³)。在s.length上限为 10⁵ 的约束下见 题解文档O(n³) 的暴力做法必然超时必须寻找线性算法。核心思路不定长滑动窗口窗口合法性的关键不等式替换k次后一个子串能否全部变成同一个字符取决于两个量子串长度right - left子串中出现次数最多的字符的次数max_count。子串中「非多数派字符」的数量为(right - left) - max_count。只要这个数量不超过k就可以通过最多k次替换把整个子串变成由同一个字符构成的字符串。于是得到窗口的合法性判定right - left ≤ max_count k时窗口合法替换 k 次即可使窗口内字符全部相同否则窗口不合法需要收缩左边界。这一判定正是 不定长度滑动窗口 的应用——窗口大小不固定通过左右指针动态调整维护满足条件的连续区间。算法步骤使用counts数组长度 26对应 26 个大写字母统计字母频数使用left、right双指针分别指向滑动窗口的首尾位置使用max_count维护窗口内出现次数最多的字符的次数。不断右移right指针增加滑动窗口的长度并同步更新counts与max_count。对于当前滑动窗口的子串如果right - left max_count k说明即使替换k次仍不能使当前窗口中的字符全部变为相同字符此时应将左边界left右移同时将原先左边界的字符频次减一。循环结束时right - left即为所求的最长重复字符子串长度。一个容易忽略的关键点max_count 从不缩水在标准实现中收缩左边界时不会重新计算max_count即便被移出的恰好是出现最多的字符max_count也不会减小。这是有意为之的max_count表示的是历史出现过的最大的「窗口内多数派字符频数」窗口合法性判定的目标并不是让每个时刻的窗口都合法而是让窗口只扩大、不缩小当窗口不合法时左指针移动一步窗口长度保持不变当窗口合法时右指针移动一步窗口长度加一。因此right - left单调不减最终值就是所有合法窗口中的最大长度即问题的答案。这种做法牺牲了max_count的实时精确性换来的是 O(n) 的单次扫描复杂度是本题最精妙的工程化取舍。完整代码与逐行解读以下是 题解文档 给出的标准实现class Solution: def characterReplacement(self, s: str, k: int) - int: max_count 0 left, right 0, 0 counts [0 for _ in range(26)] while right len(s): num_right ord(s[right]) - ord(A) counts[num_right] 1 max_count max(max_count, counts[num_right]) right 1 if right - left max_count k: num_left ord(s[left]) - ord(A) counts[num_left] - 1 left 1 return right - left逐行解读代码作用counts [0 for _ in range(26)]频数统计数组下标0~25对应字母A~Z由于题目限定仅含大写字母用定长数组比哈希表更省内存、更快num_right ord(s[right]) - ord(A)将右指针字符映射为数组下标ord(A)的值为 65任何大写字母减 65 得到 0~25 的整数counts[num_right] 1右指针字符进入窗口频数加一max_count max(max_count, counts[num_right])更新窗口内最大字符频数只增不减if right - left max_count k:窗口合法性判定right - left此时是right自增后的新窗口长度若超过max_count k说明替换k次也无法让窗口内字符统一counts[num_left] - 1; left 1左指针右移一步把离开窗口的字符频数减一收缩窗口return right - left循环结束时窗口长度即为历史最大合法窗口长度注意由于每轮循环要么right右移窗口变大要么left右移窗口保持窗口长度right - left在整个过程中单调不减因此循环结束后直接返回right - left即可无需单独用变量记录最大值。示例推演s AABABBA, k 1right当前字符频数变化max_count判定right-left max_countkleft窗口0AA:111 ≤ 2不收缩0[0,0]1AA:222 ≤ 3不收缩0[0,1]2BB:123 ≤ 3不收缩0[0,2]3AA:334 ≤ 4不收缩0[0,3]4BB:235 4收缩1[1,4]5BB:336-15 4收缩2[2,5]6AA:237-25 4收缩3[3,6]循环结束right - left 7 - 3 4与示例输出一致。窗口[3,6]对应子串BBBA其中B出现 3 次替换 1 次即可得到BBBB长度为 4。复杂度分析时间复杂度O(n)其中 n 为字符串的长度。right与left各至多移动 n 次全程只扫描一遍字符串不存在嵌套循环。空间复杂度O(|Σ|)其中 Σ 是字符集。本题|Σ| 26即counts数组大小固定为 26与字符串长度无关。作为对比暴力枚举的时间复杂度 O(n³) 在 n 10⁵ 时完全不可行而滑动窗口方案将其压缩到 O(n)这正是「窗口合法性判定 只增不减的 max_count」带来的收益。同类题型迁移LeetCode 1004「最大连续 1 的个数 III」「替换后的最长重复字符」是「最多替换 K 次使区间内元素一致」问题族的模板题。仓库中 1004. 最大连续 1 的个数 III 是它的直接变体给定一个由 0、1 组成的数组最多可以把k个 0 变成 1返回仅包含 1 的最长连续子数组长度。两题的对应关系如下维度0424 替换后的最长重复字符1004 最大连续 1 的个数 III输入仅含大写字母的字符串s仅含 0、1 的数组nums替换对象任意非多数派字符窗口内的 0窗口合法条件right - left ≤ max_count k0 的个数 ≤ k核心数据结构26 长度频数数组counts单个计数器zero_count1004 的题解代码见 max-consecutive-ones-iii.md同样采用「right 右移扩大窗口、不合法时 left 右移收缩窗口」的同一套框架只是把「最大频数」替换成了更简单的「0 的个数」判断。建议两题对照练习可以深刻理解滑动窗口的合法性条件是如何随着问题语义变化的。刷题定位与延伸学习在 滑动窗口题目列表 中本题被归入「不定长度窗口题目」类别与 0003. 无重复字符的最长子串、0159. 至多包含两个不同字符的最长子串、0340. 至多包含 K 个不同字符的最长子串 等题同属一族可以一并刷完形成体系。滑动窗口算法本身的通用定义与两种形态固定长度窗口、不定长度窗口的代码模板可参考仓库的 滑动窗口算法讲解内含不定长窗口的标准模板与「无重复字符的最长子串」例题。本题与 1004 的官方归类同样可在 题解总览 与 分类目录 中查证。总结「替换后的最长重复字符」是学习不定长滑动窗口时不可跳过的一道经典题其核心收获有三点把操作语义翻译成窗口条件题目允许替换k次等价于「窗口内非多数派字符数 ≤ k」即right - left ≤ max_count k用频数数组替代哈希表字符集已知且固定26 个大写字母时定长数组下标映射比哈希表更高效理解 max_count 只增不减的正确性滑动窗口求最长区间时允许窗口只扩张不收缩历史最大值可以作为合法性判定的保守依据这是复杂度从 O(n³) 降到 O(n) 的关键。掌握本题后面对「最多替换/翻转 K 次求最长一致区间」类问题如 1004、487只需调整窗口合法性条件的表达即可快速套用同一套模板。赞分享教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载相关推荐LeetCode 0424 最长重复字符替换Longest Repeating Character Replacement滑动窗口三步进阶与多语言实现解析LeetCode 0424 最长重复字符替换Longest Repeating Character Replacement滑动窗口三步进阶与多语言实现解析示例工程教程LeetCode 424 替换后的最长重复字符滑动窗口与最长连续 1 模型的两种解法详解LeetCode 424 替换后的最长重复字符滑动窗口与最长连续 1 模型的两种解法详解 导读 LeetCode 424 题《替换后的最长重复字符》Lo文档教程知识库codeforces-go 题解精讲LeetCode 2958「最多 K 次频率的最长子数组」——不定长滑动窗口的经典实战codeforces go 题解精讲LeetCode 2958「最多 K 次频率的最长子数组」——不定长滑动窗口的经典实战 本文以算法竞赛模板库 codefo科学计算上一篇Flair 情感分析实战指南使用预训练 sentiment 模型进行文本情感分类下一篇Vega 实战用 Faceted Group Mark 构建 Barley Trellis Plot 小多图创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Engram Cloud Dashboard UI 组件规范:页面、卡片、指标与关联导航的实战指南

Engram Cloud Dashboard UI 组件规范:页面、卡片、指标与关联导航的实战指南

人工智能AI AgentAgent记忆MCP服务 【免费下载链接】engram Persistent memory system for AI coding agents. Agent-agnostic Go binary with SQLite FTS5, MCP server, HTTP API, CLI, and TUI. 项目地址: https://gitcode.com/gh_mirrors/engra/engram 点击查看…

2026/10/9 5:06:14 阅读更多 →
GoFrame:五分钟起一个企业级 HTTP 服务

GoFrame:五分钟起一个企业级 HTTP 服务

GoFrame:五分钟起一个企业级 HTTP 服务 【免费下载链接】gf A powerful framework for faster, easier, and more efficient project development. 项目地址: https://gitcode.com/GitHub_Trending/gf/gf 搭 Go 企业服务,头一个钟头往往耗在写 HT…

2026/10/9 5:06:14 阅读更多 →
openJiuwen agent-core 上下文引擎 CurrentRoundCompressor:当前轮工作压缩器的配置、原理与实战

openJiuwen agent-core 上下文引擎 CurrentRoundCompressor:当前轮工作压缩器的配置、原理与实战

人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习 【免费下载链接】agent-core openJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力 项目地址: https://gitcode.com/openJiuwen/agent-core 点击查看 免费下载 导读 本文讲…

2026/10/9 5:06:14 阅读更多 →

最新新闻

最新IPA在线签名系统源码 全开源版本

最新IPA在线签名系统源码 全开源版本

源码下载:download.csdn.net/download/m0_66047725/93654842简介:最新IPA在线签名系统源码 全开源版本基于Thinkphp8.0VUE3开发 配合Zsign工具签名前台vue 后台使用art design pro管理框架后台带软件源自动拉取支持自助签名 支持在线签名测试环境&…

2026/10/9 5:36:41 阅读更多 →
2026最新版短视频去水印+视频号去水印小程序版本源码

2026最新版短视频去水印+视频号去水印小程序版本源码

源码下载:download.csdn.net/download/m0_66047725/93654835简介:2026最新版短视频去水印+视频号去水印小程序版本源码图片:安装教程:环境:PHP7.4MySQL5.7域名:必须备案,申请SSL证书…

2026/10/9 5:36:41 阅读更多 →
【ENSP】技巧

【ENSP】技巧

ENSP文章合集: https://wwaul.lanzout.com/b01gid75ah 密码:4r01 设备可视化操作 连线 通常,我们使用auto自动链接,但他没法选择端口及线的类型,比如交换机和路由器之前的链接,默认使用了交换机的e 0/0/3口交换机的g 0…

2026/10/9 5:36:41 阅读更多 →
GitHub日榜高效刷法:从star陷阱到技术选型的避坑指南

GitHub日榜高效刷法:从star陷阱到技术选型的避坑指南

每天早上到工位,我第一件事不是查邮件,而是先打开GitHub的Trending页面,看一遍日期最接近的日榜。这个习惯保持了一两年,从中挖到过不少能直接落地到项目的库,也踩过不少看起来很美、实际中看不中用的坑。GitHub热榜说…

2026/10/9 5:36:41 阅读更多 →
随机化学算法在电网连锁故障N-k分析中的Matlab实现

随机化学算法在电网连锁故障N-k分析中的Matlab实现

电网连锁故障分析这件事,做过的人都知道有多头疼。系统规模一上来,想判断哪几种故障组合最容易把电网拖入大停电,暴力枚举几乎不可行,蒙特卡洛又慢得让人失去耐心。去年我在做 N-k 安全分析时接触到了“随机化学”这个思路&#x…

2026/10/9 5:36:41 阅读更多 →
学Simulink——基于反电动势过零检测的直流无刷电机(BLDC)无感控制仿真

学Simulink——基于反电动势过零检测的直流无刷电机(BLDC)无感控制仿真

目录 手把手教你学Simulink——基于反电动势过零检测的直流无刷电机(BLDC)无感控制仿真 一、 引言:当“霍尔传感器”成为过去式——反电动势过零检测如何成就真正的“无感”BLDC? 二、 问题本质:反电动势过零的“物理机制”与“协同逻辑” 1. 核心物理机制 2. 协同逻辑…

2026/10/9 5:35:40 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →