思路:参考题解:seerJJJ发布的题解


不必纠结maxL到底要不是随着窗口的变化而变化,maxL始终代表记录过的一个窗口中出现最多字符的个数,所以它肯定要么保持不变,要么增大;每次右移后都找滑窗中出现最多的字符个数,这很明显是没有必要的;

#include <iostream>
#include <vector>
using namespace std;int characterReplacement(string s, int k)
{int left = 0, right = 0, maxL = 0;int len = s.size();if (len == 0)return 0;vector<int> letter(26, 0);//数组纪录相同的字母出现的次数while (right < len) //右指针从左向右不停的移动,直到字符串末尾{letter[s[right] - 'A']++; //letter中该字符相对'A'的位置++(代表窗口内该字符的出现的个数)maxL = max(maxL, letter[s[right] - 'A']); //一个窗口内最多出现的字符if (right - left + 1 > maxL + k)//窗口长度超出可替换的最大限度,那么整个窗口右移{letter[s[left++] - 'A']--; //左指针所指字符个数--}right++;}return len - left; //结束时窗口的长度
}int main()
{cout << characterReplacement("AABABBA", 1) << endl;return 0;
}

也不上一个之前写的比较慢的双指针方法吧,有点像慢化版的窗口滑动;

int characterReplacement(string s, int k)
{int len = s.size();int l = 0, r = 0;int res = 0, count = 0, kk = 0; //kk代表当前滑窗中被替换的字符数量;if (len == 0)return 0;char pre = s[0];int next_l = 0; //遇到第一个不同的字符时,把它预先设置为下一个滑窗的左端点;bool flag = true;//保证next_l是当前滑窗第一个不同的字符while (r < len){if (s[r] == pre){count++;r++;}else{kk++;if (flag){flag = false;next_l = r;}if (kk <= k) {count++;r++;}else{res = max(res, count);count = 0;kk = 0;l = next_l;pre = s[l];r = l;flag = true;}}}if (r == len){int add = min(len - count, k - kk);count += add;res = max(res, count);}return res;
}

Leetcode每日一题: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】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  3. leetcode 424. Longest Repeating Character Replacement | 424. 替换后的最长重复字符(Java)

    题目 https://leetcode.com/problems/longest-repeating-character-replacement/ 题解 class Solution {public ...

  4. 2022-2-12 Leetcode 424.替换后的最长重复字符

    class Solution {public:int characterReplacement(string s, int k) {vector<int> num(26);//建立 has ...

  5. leetcode 424. 替换后的最长重复字符(滑动窗口)

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

  6. LeetCode 424. 替换后的最长重复字符(双指针+滑动窗口)

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

  7. LeetCode Longest Repeating Character Replacement(滑动窗口)

    问题:给出一个由大写字母构成的字符串,可以对字符串最多作k次操作,将一个字符转换为另外一个字符. 找出操作后最长的重复子串 思路:使用滑动窗口,及用一个长度为26的数组记录字符个数.初始时,窗口大小为 ...

  8. 第十二Leetcode每日刷题——524. 通过删除字母匹配到字典里最长单词

    给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到. 如果答案不止一个,返回长度最长且字母序最小 ...

  9. Leetcode每日一题:861.score-after-flipping-matrix(反转矩阵后的得分)

    思路:二进制一个高位为1比之后所有低位为1所代表的数字都要大,所以首先要确保每一行的第一位为1,然后在这基础上对于每一列,如果零的个数多于1的个数,将这列翻转: static int dec(vect ...

最新文章

  1. TCP/IP详解--第九章
  2. Android 4.4 中 WebView 使用注意事项
  3. Algorithm:数学建模大赛之数学建模基础(经验/技巧)、流程(模型准备/模型假设/建模/求解/分析/优化/预测/评价)、论文写作(意义/摘要/关键词/问题重述和模型假设/建模/文献)之详细攻略
  4. java基础系列:集合基础(3)
  5. 协议簇:TCP 解析: 连接断开
  6. MySQL 的CASE WHEN 语句
  7. oracle 求班级平均分
  8. Excel案例-杜邦分析法
  9. linux使用入门教程
  10. Atiitt 知识图谱的艺术 艾提拉著 目录 1. 常见知识图谱的处理技术 1 2. 常用的公开知识图谱如DBpedia, Freebase, Yago,Openkg等 2 3. 构建知识图谱的方
  11. ALFA机器视觉深度学习外观缺陷检测系统软件机器视觉
  12. android 用blend设计,Android OpenGLES2.0(十八)——轻松搞定Blend颜色混合
  13. 计算机专业的男生喜欢你,男生真心喜欢你的五个表现
  14. 赠书 | 《网络威胁情报技术指南》
  15. phpstudy不能启动mysql_phpStudy启动后为什么MYSQL无法启动
  16. 雅思-我们遇到过的哪些熟悉又陌生的单词1
  17. 智能网联汽车激光雷达工作原理、性能比较与安全性分析
  18. matlab 画 带虚部,MATLAB1:求实部、虚部、模和幅角的运算
  19. 大学物理复习-静电场
  20. 什么是OID(全局对象标识符)

热门文章

  1. PLSA隐变量主题模型的公式推导解惑
  2. 在HTML中插入回车换行
  3. 百度地图删除地图上所有的标注和所有的覆盖物
  4. readonly 与 const
  5. python 将数据写入excel
  6. [Hadoop] - 异常Cannot obtain block length for LocatedBlock
  7. Electron 打包Mac安装包代码签名问题解决方案Could not get code signature for running application
  8. 2021人工智能竞赛白皮书:1000场竞赛的深度分析
  9. 别太相信自己,总有一种诈骗戳中你的刚需
  10. 【干货】华为组织成长的动力机制.pdf(附下载链接)