【LeetCode】424. 替换后的最长重复字符
424. 替换后的最长重复字符
知识点:字符串,滑动窗口;
题目描述
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:字符串长度 和 k 不会超过 104。
示例
输入:s = "ABAB", k = 2
输出:4
解释:用两个'A'替换为两个'B',反之亦然。
输入:s = "AABABBA", k = 1
输出:4
解释:
将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
子串 "BBBB" 有最长重复字母, 答案为 4。
解法一:滑动窗口
这道题其实挺复杂的,里面有一些细节很难想;
想一下滑动窗口模板:
这道题目的条件时什么:当前窗口里出现次数最多的字母+k等于窗口长度
当达到这个条件后,如果下一个字符不是出现最多的字符,那左窗口就要移动了。
所以我们需要一个变量来记录当前窗口哪个字母出现的最大次数
class Solution {
public int characterReplacement(String s, int k) {
int[] num = new int[26];
int n = s.length();
int maxn = 0;
int left = 0, right = 0;
while (right < n) {
int indexR = s.charAt(right) - 'A';
num[indexR]++;
//求窗口中曾出现某字母的最大次数
//计算某字母出现在某窗口中的最大次数,窗口长度只能增大或者不变
//这样做的意义:我们求的是最长,如果找不到更长的维持长度不变返回结果不受影响
maxn = Math.max(maxn, num[indexR]);
//如果选择了maxn,那说明又多消耗了一个k;检查一下k还够不够用了,不够用的话整体移动,注意窗口大小是不变的。
//长度len=right-left+1,以下简称len
//len>字母出现最大次数+替换数目,说明k不够用了,这时候得把窗口向左移;
//分析一下,替换数目是不变的=k,字母出现最大次数是可能变化的,因此,只有字母出现最大次数增加的情况,len才能拿到最大值
//left和right一起移动,len不变的
if (right - left + 1 - maxn > k) {
//这里要减的,因为left越过该点,会对最大值有影响
num[s.charAt(left) - 'A']--;
left++;
}
//走完这里的时候,其实right会多走一步
right++;
}
//因为right多走一步,结果为(right-1)-left+1==right-left
return right - left;
}
}
细节:
- 1.num中存的是什么:num中放的是当前窗口中各字母的长度,所以当我们将左边界移动的时候,要把左边界那个移出去的元素次数-1;
- 2.maxn这个变量:要注意maxn这个变量是在维持一个历史窗口中的最大值。为什么维持一个历史最大值,而不是当前窗口,从根本原因就在于窗口是只增不减的;如果遍历到的right能够不消耗k,那就可以right++,继续窗口扩张;如果遍历到的right更多的消耗了k,那就要看消耗后k还够不够用了,要是不够用了,那把整个窗口进行滑动,这时的窗口大小不变;
比如一个子串k=2,然后有一段他的最大重复个数maxn是4,这时候他的长度是6,然后移动滑动窗口到另一段,如果这一串的最大重复个数小于4,那一定不会得到一个大于6的结果,所以记录历史最大值是可以了。记住我们找的是最长,如果找不到更长,那就维持不变就可以了
相关链接
【LeetCode】424. 替换后的最长重复字符的更多相关文章
- Java实现 LeetCode 424 替换后的最长重复字符
424. 替换后的最长重复字符 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 注意: 字 ...
- Leetcode 424.替换后的最长重复字符
替换后的最长重复字符 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 注意:字符串长度 和 ...
- 【LeetCode】424. 替换后的最长重复字符 Longest Repeating Character Replacement(Python)
作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,字符串,双指针,刷题群 目录 题目描述 题目大意 解题方法 双指针 代码 欢迎 ...
- 424 Longest Repeating Character Replacement 替换后的最长重复字符
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度.注意:字符串长度 和 k 不会超过 104. ...
- [Swift]LeetCode424. 替换后的最长重复字符 | Longest Repeating Character Replacement
Given a string that consists of only uppercase English letters, you can replace any letter in the st ...
- [LeetCode] Longest Repeating Character Replacement 最长重复字符置换
Given a string that consists of only uppercase English letters, you can replace any letter in the st ...
- leetcode刷题第三天<无重复字符的最长子串>
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 : 输入: "abcabcbb" 输出: 解释: 因为无重复字符的最长子串是 . 示例 : 输入: &quo ...
- leetcode 刷题(3)--- 无重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...
- Leetcode(三)无重复字符的最长子串
3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...
随机推荐
- Kubernetes自动伸缩pod-HPA
在运维中,虽然能预先知道负载何时会飙升,或者如果负载的变化是较长时间内逐渐发生的,手动扩容也是可以接受的,但指望靠人工干预来处理突发而不可预测的流量增长,仍然不够理想. 幸运的是,Kubernetes ...
- 流程自动化RPA,Power Automate Desktop系列 - 批量备份Git仓库做好灾备
一.背景 打个比如,你在Github上的代码库需要批量的定时备案到本地的Gitlab上,以便Github不能访问时,可以继续编写,这时候我们可以基于Power Automate Desktop来实现一 ...
- 24、Keepalived高可用介绍
24.1.什么是keepalived: Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP ...
- diff -u:内核开发的新项目
译至:http://www.linuxjournal.com/content/diff-u-whats-new-kernel-development-1 Linux的一个问题是它的系统调用实现 . 正 ...
- Fiddler大全之断点操作
打断点(bpu) 1.为什么要打断点呢?比如一个购买的金额输入框,输入框前端做了限制100-1000,那么我们测试的时候,需要测试小于100的情况下.很显然前端只能输入大于100的.这是我们可以先抓到 ...
- Java | 字符串的使用 & 分析
字符串 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,在程序中所有的双引号字符串,都是String类的对象. 字符串的特点 1.字符串的内容永不可变. 2.正在是因为字符串的不 ...
- 使用oss来存取及优化图片资源
目录 1. 开通阿里云OSS,并创建存储空间 2. 图片上传及处理 2.1 图片上传 2.2 图片处理 前言: 在日常开发中,不免会遇到需要实现图片上传与展示的需求.比如一个文章发布系统,我们通常会开 ...
- OSPF的基本工作原理
OSPF的基本工作原理 1.定义 2.特点 3.基本概念 4.OSPF五种分组类型 5.DR/BDR 6.区域 1.定义 开放最短路径优先OSPF,是为了克服RIP的缺点在1989年开发出来的. &q ...
- Kettle——shell交互命令
Kettle--shell交互命令 在kettle上开发了job或transform可以以单独的文件存在,也可以存放在资源库中.调用这些程序可以通过shell脚本调用,记录下: 资源库中的job: . ...
- Python_结合Re正则模块爬虫
##### 爬取古诗文import reimport requestsdef parse_page(url): headers = { 'User-Agent':'Mozilla/5.0 (Windo ...