滑动窗口:给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
一、问题描述
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 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 次。在执行上述操作后,找到包含重复字母的最长子串的长度。相关推荐
- LeetCode: 3_Longest Substring Without Repeating Characters | 求没有重复字符的最长子串的长度 | Medium...
题目: Given a string, find the length of the longest substring without repeating characters. For examp ...
- 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 ...
- 练习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< ...
- 练习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的其余各位保持不变. 参考代码如 ...
- 【每日一练及解题思路V1】给定一个字符串,找出其中不含重复字符的最长子串的长度
一.题目:给定一个字符串,找出其中不含重复字符的最长子串的长度: 二.举例: 比如"abcdefgh",不含重复字符的最长子串为eacdb,长度为8: 比如"abceac ...
- python练习题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 题目解析: 有一个字符串,长度不定, 要找出不重复字符串的长度,我们可以这么假设,先找到第一个下标,然后从后面拿到元素的下标对 ...
- (java)给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. public class LengthOfLongestSubstring {public int lengthOfLonges ...
- 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "ab ...
- 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度
题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &q ...
最新文章
- RabbitMQ 入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)
- LeetCode 687. 最长同值路径(二叉树,递归)
- requestparam的作用_关于@RequestMapping和@RequestParam注解(四)
- Layui--颜色选择器layui.colorpicker
- 令牌桶算法和漏桶算法python_限流之漏桶算法与令牌桶算法
- LTE通讯相关2:频带、信道带宽和频点号EARFCN
- Feedsky尝试Feed点击付费广告
- 声律启蒙--喜欢这个韵律
- 同时看过 unreal4 和 Unity 源代码的人觉得哪个引擎架构更好?
- 暗影精灵三 英伟达显卡 Ubuntu16.04 安装网卡驱动连接wifi
- UE 某图局部 展UV 图标 / CSS 精灵图(sprite) 好像
- 中专计算机与外设维修,《计算机维护与维的修》级计算机及外设维修三中专教学大纲.doc...
- JAVA冰箱评测开题报告_基于CFD的风冷冰箱后风道数值计算和优化设计开题报告...
- 自从有了BI商业智能系统,再也不用担心我的作图了!!!(图文)
- android私密照片恢复,如何恢复手机删除照片? 超实用操作方法!
- 计算机程序员的英文简历,电脑程序员英文简历范文
- android 百度语音 对话框,Android 通过调用系统接口使用如 谷歌语音、百度语音、讯飞语音等语音识别对话框的方法...
- 实战6:基于OpenCV的人脸口罩识别检测详细教程
- 你一定用得到的LaTeX入门资料
- 四人竞赛抢答器的设计