以最左边为开始,往右遍历,不一样的个数大于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的更多相关文章

  1. LeetCode 424. Longest Repeating Character Replacement

    原题链接在这里:https://leetcode.com/problems/longest-repeating-character-replacement/description/ 题目: Given ...

  2. 【leetcode】424. Longest Repeating Character Replacement

    题目如下: Given a string that consists of only uppercase English letters, you can replace any letter in ...

  3. 424 Longest Repeating Character Replacement 替换后的最长重复字符

    给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度.注意:字符串长度 和 k 不会超过 104. ...

  4. 【LeetCode】424. 替换后的最长重复字符 Longest Repeating Character Replacement(Python)

    作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,字符串,双指针,刷题群 目录 题目描述 题目大意 解题方法 双指针 代码 欢迎 ...

  5. Leetcode: Longest Repeating Character Replacement && G 面经

    Given a string that consists of only uppercase English letters, you can replace any letter in the st ...

  6. [Swift]LeetCode424. 替换后的最长重复字符 | Longest Repeating Character Replacement

    Given a string that consists of only uppercase English letters, you can replace any letter in the st ...

  7. G 面经 && Leetcode: Longest Repeating Character Replacement

    Given a string that consists of only uppercase English letters, you can replace any letter in the st ...

  8. LeetCode——Longest Repeating Character Replacement

    1. Question Given a string that consists of only uppercase English letters, you can replace any lett ...

  9. leetcode424 Longest Repeating Character Replacement

    """ Given a string s that consists of only uppercase English letters, you can perform ...

随机推荐

  1. PL/SQL Developer远程连接Oracle数据库

    首先打开电脑,到pl/sql安装的指定目录[D:\app\DZL\product\11.2.0\dbhome_1\NETWORK\ADMIN]找到[tnsnames.ora]     打开[tnsna ...

  2. 用layer添加UIView的动画

    项目有时会遇到用UIView 添加动画的情况,这里我觉得在layer上添加动画比较好,因为可以详细地设定动画属性,方便理解 下面是一个旋转动画: -(void)roundBtnAction:(id)s ...

  3. IIViewDeckController的使用,左右拖拉菜单效果实现

    博客园   IIViewDeckController的使用,左右拖拉菜单效果实现   很多应用里面都实现了对应的侧拉 显示隐藏的效果,看起来很符合用户体验的类似于这种   看起来很好看,今天去晚上搜下 ...

  4. 微软SQLHelper.cs类

    using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...

  5. SGU 144.Meeting

    题目: 两支地区ACM比赛的队伍决定为了国际决赛而在一起集训. 他们约定在某天的 X 时到 Y 时的某一时刻相会. 但由于他们很少按时到 (有的队伍比赛那天都会迟到), 他们没有设定一个确切的相遇时间 ...

  6. 『重构--改善既有代码的设计』读书笔记----Remove Middle Man

    如果你发现某个类做了过多的简单委托动作,你就可以考虑是否可以让客户直接去调用受托类.在Hide Delegate中,我们介绍了封装受托对象的好处,但好处归好处也存在代价,就是当你每次需要在受托对象中增 ...

  7. ZOJ3870 Team Formation

    /** Author: Oliver ProblemId: ZOJ3870 Team Formation */ /* 思路 1.异或运算,使用^会爆,想到二进制: 2.我们可以试着从前往后模拟一位一位 ...

  8. 在Lufylegend中如何设置bitmap或者sprite的缩放和旋转中心

    最近两天有个lufylegend游戏引擎群的群友需要做一个项目,其中要解决的需求是:获取照相机拍摄的图片,根据图片的EXIF信息让图片显示为“正常”情况,并且需要给图片添加一些事件侦听.何为正常呢?就 ...

  9. Nginx fastcgi_param解释

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径 fastcgi_param QUERY_STRI ...

  10. html5系列.基础知识

    兼容性问题 创建一个html5页面 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...