424. Longest Repeating Character Replacement
以最左边为开始,往右遍历,不一样的个数大于K的时候停止,回到第一个不一样的地方,以它为开始,继续。。
用QUEUE记录每次不一样的INDEX,以便下一个遍历开始,
从左往右,从右往左各来一次。。加上各种剪枝情况,比如未遍历的数量<剩余K的数量,比如已经记录过某个INDEX了。。
然后TLE了。。。最后放TLE的方法。。不知道有什么意义。。
上面的做法是左右各来一次,那是否可以使用滑窗呢。。
然后没做出来。。看了讨论区。。果然是滑窗。。
思路:
统计当前滑窗内最多的字母,窗口宽度 - 最多字母数量 <= K,就可以继续尝试扩大窗口,R++。 否则缩小,L++。
比我一开始的那个傻逼办法的改进在于,自动转换字母,我那个必须记录不同字母,比如AAABBBBB当B多的时候,必须退回到第一个B,重新遍历。。而且不用反向再来一次。
至少。。我。。猜对。。滑。。滑窗。。了。。

public class Solution
{
public int characterReplacement(String s, int k)
{
int[] letter = new int[26];
int l = 0;
int most = ++letter[s.charAt(0) - 'A'];
int res = 1;
for(int r = 1; r < s.length();r++)
{
most = Math.max(most,++letter[s.charAt(r) - 'A']);
if(most + k < r - l + 1) // can't maintain this size of window
{
letter[s.charAt(l++)-'A']--;
}
res = Math.max(res,r-l+1);
}
return res;
}
}
二刷。
这个题刚做的,还有印象,滑窗。
但是凭印象做完,回头看这个做法非常巧妙。
我还记得一开始的思路是滑窗,但是做不出来,当时的想法是:
最多的字母 + Others(k) = Length
每次滑窗扩大都需要统计最多的字母,然后相应地要改变Others(或者不改变),再和K比较,决定窗口的左端是否缩进,然后缩进又会减少相应的字母,又要重新判断最多的字母。。。此时右端保持不动。。。
这里忽略了一个问题就是,缩进的目的有2个,一个是通过减少不一样的字母(others)来满足others <= k;或者通过改变最多的字母(most)来满足others <= k,因为只有在满足的情况下我们才会更新res的最大值。 简而言之,通过不停地让窗口左端缩进,目的只有一个others <= k,一旦这个满足我们就可以update res,但是,既然我们都他妈缩进了,肯定比前面的结果小,还更新个鸡巴。。
这里巧妙就巧妙在,左边缩进的同时右边扩大,因为窗口再变小即使满足others <= k,窗口大小也是小于res的,so why bother...and who gives a shit..所以直接右边扩大就行了。。
一开始的想法是尽量满足others <= k的时候判断窗口大小;
后来的做法是保持窗口>当前最大值res的情况下,我们才看是否满足others <= k,满足才更新。。
这些问题一刷都没想,光觉得卧槽这个做法牛逼啊。
其实二刷仔细想想,才发现,确实牛逼啊

public class Solution {
public int characterReplacement(String s, int k) {
if (s.length() == 0) return 0;
int[] map = new int[26];
int most = ++map[s.charAt(0) - 'A'];
int res = 1;
int left = 0;
for (int right = 1; right < s.length(); right++) {
most = Math.max(most,++map[s.charAt(right) - 'A']);
if (right - left + 1 > most + k) {
map[s.charAt(left++) - 'A']--;
} else {
res = Math.max(res,right - left + 1);
}
}
return res;
}
}
三刷。
脑残啊卧槽,又忘了怎么做了。
windowSize - numOfMajorityElement <= K
主要就是这行,满足的时候更新windowSize,
不满足的时候减少windowSize,减少之后numOfMajorityElement也会变,但是不会变大。
public class Solution {
public int characterReplacement(String s, int k) {
if (s.length() == 0) return 0;
int res = 0;
int l = 0;
int[] letters = new int[26];
int maj = 0;
for (int r = 0; r < s.length(); r++) {
char c = s.charAt(r);
maj = Math.max(maj, ++ letters[c -'A']);
int winSize = r - l + 1;
if (winSize - maj <= k) {
res = Math.max(winSize, res);
} else {
letters[s.charAt(l++) - 'A'] --;
}
}
return res;
}
}
424. Longest Repeating Character Replacement的更多相关文章
- LeetCode 424. Longest Repeating Character Replacement
原题链接在这里:https://leetcode.com/problems/longest-repeating-character-replacement/description/ 题目: Given ...
- 【leetcode】424. Longest Repeating Character Replacement
题目如下: Given a string that consists of only uppercase English letters, you can replace any letter in ...
- 424 Longest Repeating Character Replacement 替换后的最长重复字符
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度.注意:字符串长度 和 k 不会超过 104. ...
- 【LeetCode】424. 替换后的最长重复字符 Longest Repeating Character Replacement(Python)
作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,字符串,双指针,刷题群 目录 题目描述 题目大意 解题方法 双指针 代码 欢迎 ...
- Leetcode: Longest Repeating Character Replacement && G 面经
Given a string that consists of only uppercase English letters, you can replace any letter in the st ...
- [Swift]LeetCode424. 替换后的最长重复字符 | Longest Repeating Character Replacement
Given a string that consists of only uppercase English letters, you can replace any letter in the st ...
- G 面经 && Leetcode: 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
1. Question Given a string that consists of only uppercase English letters, you can replace any lett ...
- leetcode424 Longest Repeating Character Replacement
""" Given a string s that consists of only uppercase English letters, you can perform ...
随机推荐
- java基础易错点总结(一)
子类继承父类表示子类比他的父类包含更多的信息和方法 子类调用重载的构造方法时会调用父类的构造方法,super();一般如果不写的话会隐式的调用,而且每次调用都在所有语句之前. 在函数中,使用父类的地方 ...
- Spring MVC中注解 @ModelAttribute
1.@ModelAttribute放在方法之上,在当前Control内的所有方法映射多个URL的请求,都会执行该方法 @ModelAttribute public void itemsCommon(H ...
- SGU 148.B-Station
时间限制:0.25s 空间限制:4M 题目 在离著名的国家Berland不远的地方,有一个水下工作站.这个工作站有N层.已知:是第层装有Wi的水,最多可以容纳Li的水,恐怖分子炸毁第i的代价是Pi. ...
- CSS的inherit与auto使用分析
一个很显浅的寓言,千年老树,电打雷劈,屹立不倒,却毁于蝼蚁的侵袭之下.自以为精通CSS的人,常常被一些小问题搞到头晕脑胀. 通常是一个很小的数值,经过层层放大歪曲后,整个布局就走形了.CSS是一门很简 ...
- MyBatis Generator自动生成MyBatis的映射代码
MyBatis Generator大大简化了MyBatis的数据库的代码编写,有了一个配置文件,就可以直接根据表映射成实体类.Dao类和xml映射.资源地址:MyBatis项目地址:http://my ...
- XAMPP 使用教程
XAMPP 是一个把Apache网页服务器与PHP.Perl及MySQL集合在一起的安装包,允许用户可以在自己的电脑上轻易的建立网页服务器.使用 XAMPP 您可以轻松的在本机调试您的 PHP ...
- discuz二次开发技巧
discuz二次开发技巧 二次开发大多时候知识设置和处理,如果能够获知模板文件获得的变量数组将大大提高我们的开发效率 获取页面已经定义的变量 <--{eval printf_r(get_defi ...
- Python自动化运维之29、Bottle框架
Bottle 官网:http://bottlepy.org/docs/dev/index.html Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除 ...
- Python自动化运维之25、Ajax
一.概述 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 通过在后台与服务器进行少量数据交换 ...
- Mac电脑手动清理
Xcode的无用的文件如图找到DerivedData文件夹,删除里面文件就可以了(先找到隐藏的文件)