
【滑动窗口法】—— 424. 替换后的最长重复字符
发布日期:2021-05-07 21:20:28
浏览次数:25
分类:精选文章
本文共 1398 字,大约阅读时间需要 4 分钟。
题目描述
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:字符串长度 和 k 不会超过 104。
示例 1:
输入:s = “ABAB”, k = 2
输出:4 解释:用两个’A’替换为两个’B’,反之亦然。 示例 2:输入:s = “AABABBA”, k = 1
输出:4 解释: 将中间的一个’A’替换为’B’,字符串变为 “AABBBBA”。 子串 “BBBB” 有最长重复字母, 答案为 4。解题思路
-
右边界先移动找到一个满足题意的可以替换 k 个字符以后,所有字符都变成一样的当前看来最长的子串,直到右边界纳入一个字符以后,不能满足的时候停下;
-
然后考虑左边界向右移动,左边界只须要向右移动一格以后,右边界就又可以开始向右移动了,继续尝试找到更长的目标子串;
-
替换后的最长重复子串就产生在右边界、左边界交替向右移动的过程中。
class Solution_424 { public int characterReplacement(String s, int k) { int len = s.length(); if (len < 2){ return len; } char[] charArray = s.toCharArray(); //左右边界都从头开始 int left = 0; int right = 0; int res = 0; int maxCount = 0; int[] freq = new int[26]; // [left, right) 内最多替换 k 个字符可以得到只有一种字符的子串 while (right < len){ freq[charArray[right] - 'A']++; // 在这里维护 maxCount,因为每一次右边界读入一个字符,字符频数增加,才会使得 maxCount 增加 maxCount = Math.max(maxCount,freq[charArray[right] - 'A']); right++; if (right - left > maxCount + k){ // 说明此时 k 不够用 // 把其它不是最多出现的字符替换以后,都不能填满这个滑动的窗口,这个时候须要考虑左边界向右移动 // 移出滑动窗口的时候,频数数组须要相应地做减法 freq[charArray[left]-'A']--; left++; } res = Math.max(res,right-left); } return res; }}
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月12日 12时03分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
从面试官角度告诉大家如何准备项目方面的描述
2021-05-08
去创业公司不能有一夜暴富的侥幸,更不能指望掉馅饼
2021-05-08
架构师入门:搭建基本的Eureka架构(从项目里抽取)
2021-05-08
Java核心技术及面试指南 流程控制方面的面试题答案
2021-05-08
程序员如何在百忙中更有效地利用时间,如何不走岔路,不白忙(忙得要有效率,要有收获)
2021-05-08
MongoDB 快速扫盲贴
2021-05-08
修复搜狗、360等浏览器不识别SameSite=None 引起的单点登录故障
2021-05-08
明天要早起,今天不博了。
2021-05-08
2017/08/21 工作日志
2021-05-08
EXTJS4.2——10.Tab+Iframe
2021-05-08
EXTJS4.2——3.1 添加文本框
2021-05-08
WEB基础——AJAX
2021-05-08
one + two = 3
2021-05-08
Kali Day01 --- arpspoof命令进行断网攻击(ARP欺骗)
2021-05-08
echart关系图平分节点删除时自动平衡问题
2021-05-08
【Coursera】Internet History 读书笔记
2021-05-08
《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考
2021-05-08