一、问题描述

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

注意:
字符串长度 和 k 不会超过 

示例 1:

输入:
s = "ABAB", k = 2输出:
4解释:
用两个'A'替换为两个'B',反之亦然。

示例 2:

输入:
s = "AABABBA", k = 1输出:
4解释:
将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
子串 "BBBB" 有最长重复字母, 答案为 4。

题目来源:LeetCode   链接:https://leetcode-cn.com/problems/longest-repeating-character-replacement

二、解题思路

1.暴力法,一般时间都会超限

class Solution {
public:int characterReplacement(string s, int k) {int k2=k, maxlen=0, first=s.length();int i=0, j=0;                           //一个左边界i,一个右边界jwhile(i<s.length()&&j<s.length()){if(s[j]!=s[i]){if(k2>0){k2--;first = first< j ? first: j;  //first记录第一个跟s[i]不相同的元素下标//后面可以直接把i重新赋值为first,而不是i+1j++;}else                             //如果k次修改机会用完{int temp = j-i;maxlen = maxlen<temp?temp:maxlen; //记录最长字符串长度if((s.length()-first)>maxlen)   //只有first后面的字符串大于目前的maxlen{                               //继续执行才有意义,否则直接breaki = first;                  //把i赋值为firstj = i+1;                    //j为i+1k2 = k;                     //k2复原为原值}elsebreak;}}else{j++;}int temp = j-i;maxlen = maxlen<temp?temp:maxlen;}return maxlen;}
};

2.滑动窗口法

上面的暴力法最坏情况了的时间复杂度其实可以达到, 这是因为当k次修改机会用完又遇到跟左边界值s[i]不同的元素时,采取的策略是往回走,把i赋值为first,j赋值为i+1。而滑动窗口的思想就是一直往前滑,争取达到O(n)的时间复杂度。而这要怎么才能做到?

该方法时记录滑动窗口内的最多个数的字符即charMax,只要满足right - left + 1 > charMax + k即可继续向右扩张,即right++,不满足的时候就窗口整体向右移动,即同时right++,left++。这时候,假设后面都没有更长的替换后连续字符串的话,那么这个窗口长度会一直不变,知道循环结束(right走到终点),而如果后面还有更长的替换后连续字符串的话,这个窗口就会再次扩张。最后返回窗口大小,就是所求的替换后最长连续字符串的长度。

class Solution {
public:int characterReplacement(string s, int k) {if(s.length()==0)return 0;int map[26]={0};                                       //map用来记录字符数int i=0, charmax=0;                                    //map数组下标为键,内容为值for(int j=0;j<s.length();j++){int index = s[j]-'A';map[index]++;                                       //向右扩张一步charmax=charmax>map[index]?charmax:map[index];      //更新charmaxif((j-i+1)>charmax+k){map[s[i]-'A']--;                                //如果不符合条件,左边收缩//保持窗口长度不变i++;}}return s.length()-i;                                    }
};

三、总结

    1.滑动窗口通常由扩张、收缩、移动三种行为,根据解题过程的不同阶段采取不同的行为

2.滑动窗口经常搭配map使用 ,意在记录滑动窗口中的信息

3.滑动窗口很适合解决字符串类的题目

滑动窗口:给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。相关推荐

  1. LeetCode: 3_Longest Substring Without Repeating Characters | 求没有重复字符的最长子串的长度 | Medium...

    题目: Given a string, find the length of the longest substring without repeating characters. For examp ...

  2. svn执行update操作后出现:Error : Previous operation has not finished; run 'cleanup' if it was interrupted.

    svn执行update操作后出现:Error : Previous operation has not finished; run 'cleanup' if it was interrupted. s ...

  3. 练习2-7 编写一个函数invert(x,p,n),该函数返回对x执行下列操作后的结果:将x从第p位开始的n个(二进制)位求反(即1变成0,0变成1),x的其余各位保持不变。

    练习2-7 编写一个函数invert(x,p,n),该函数返回对x执行下列操作后的结果:将x从第p位开始的n个(二进制)位求反(即1变成0,0变成1),x的其余各位保持不变. #include< ...

  4. 练习2-6 编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。

    练习2-6 编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变. 参考代码如 ...

  5. 【每日一练及解题思路V1】给定一个字符串,找出其中不含重复字符的最长子串的长度

    一.题目:给定一个字符串,找出其中不含重复字符的最长子串的长度: 二.举例: 比如"abcdefgh",不含重复字符的最长子串为eacdb,长度为8: 比如"abceac ...

  6. python练习题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 题目解析: 有一个字符串,长度不定, 要找出不重复字符串的长度,我们可以这么假设,先找到第一个下标,然后从后面拿到元素的下标对 ...

  7. (java)给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. public class LengthOfLongestSubstring {public int lengthOfLonges ...

  8. 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "ab ...

  9. 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度

    题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &q ...

最新文章

  1. RabbitMQ 入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)
  2. LeetCode 687. 最长同值路径(二叉树,递归)
  3. requestparam的作用_关于@RequestMapping和@RequestParam注解(四)
  4. Layui--颜色选择器layui.colorpicker
  5. 令牌桶算法和漏桶算法python_限流之漏桶算法与令牌桶算法
  6. LTE通讯相关2:频带、信道带宽和频点号EARFCN
  7. Feedsky尝试Feed点击付费广告
  8. 声律启蒙--喜欢这个韵律
  9. 同时看过 unreal4 和 Unity 源代码的人觉得哪个引擎架构更好?
  10. 暗影精灵三 英伟达显卡 Ubuntu16.04 安装网卡驱动连接wifi
  11. UE 某图局部 展UV 图标 / CSS 精灵图(sprite) 好像
  12. 中专计算机与外设维修,《计算机维护与维的修》级计算机及外设维修三中专教学大纲.doc...
  13. JAVA冰箱评测开题报告_基于CFD的风冷冰箱后风道数值计算和优化设计开题报告...
  14. 自从有了BI商业智能系统,再也不用担心我的作图了!!!(图文)
  15. android私密照片恢复,如何恢复手机删除照片? 超实用操作方法!
  16. 计算机程序员的英文简历,电脑程序员英文简历范文
  17. android 百度语音 对话框,Android 通过调用系统接口使用如 谷歌语音、百度语音、讯飞语音等语音识别对话框的方法...
  18. 实战6:基于OpenCV的人脸口罩识别检测详细教程
  19. 你一定用得到的LaTeX入门资料
  20. 四人竞赛抢答器的设计

热门文章

  1. QUI框架多选下拉框回填
  2. 民非企业盈利怎么处理_民办非企业单位可以盈利吗
  3. docker-compose up start restart区别
  4. 托业考试资料-英语下载
  5. 石油化工行业中低压电动机回路抗晃电解决方案
  6. 广告点击延时反馈建模
  7. 近似平面点云一般特征——粗糙度
  8. esp12s 第十一章 WS2812灯带
  9. 用Python做PAT甲级1001-A+B Format
  10. c语言编程步骤Vision4,【2017年整理】keil_μVision4使用详解教程.pdf