【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 解释: 因为无重复字符的最 ...
随机推荐
- 44、djanjo工程(介绍)
44.1.什么时web框架: 1.框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用看框架可以 帮助你快速开发特定的形同,简单的说,就是你用别人搭建好的舞台来做 ...
- SpringBoot Redis 2.0.x
redis的安装 在笔者之前的文章中有介绍redis的安装,不会的可以去看 笔者之前写的文章redis安装 完成安装后如果不熟悉redis的操作,redis官方文档也有基本操作指南,redis基本操作 ...
- 查看python的安装版本,位数及安装路径
一.想要查看ubuntu中安装的Python路径 方法一:whereis python (用来快速查找任何文件,是一个文件搜索命令,与locate的功能一样.执行whereis python 会将所有 ...
- [小工具] chrome上日语翻译工具
rikaikun -> 日语 "理解君" 下载地址: https://chrome.google.com/webstore/detail/rikaikun/jipdnfibh ...
- WPF教程一:创建Hello world来理解XAML的内容及编译
在实际的WPF开发中遇到很多再用Winform写法来写WPF的开发人员,很多时候项目进度延期.出现非必要的BUG等等.大多是因为开发人员虽然是再写WPF. 但是没有好好的学过WPF,就导致无法发挥出W ...
- C语言代码段
/* 功 能:将str字符串中的oldstr字符串替换为newstr字符串 * 参 数:str:操作目标 oldstr:被替换者 newstr:替换者 * 返回值:返回替换之后的字符串 */ char ...
- asp.net mvc请求流程
收对应用程序的第一个请求 > 执行路由 > 创建 MVC 请求处理程序 > 创建控制器 > 执行控制器 > 调用操作 > 执行结果
- bat自动创建快捷方式并更换图标
1 :: 此脚本主要的作用创建1.自动创建快捷方式:2.自动更换快捷方式图标 2 @echo off 3 >nul 2>&1 "%SYSTEMROOT%\system32 ...
- python使用笔记18--写日志
1 import nnlog 2 import traceback 3 #level:输出日志级别,debug:把所有的日志都打印出来,info:打印info以上的日志, 4 # warning:打印 ...
- C语言:统计字符个数及种类
#include <stdio.h> int main(){ char c; //用户输入的字符 int shu=0;//字符总数 int letters=0, // 字母数目 space ...