惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
Martin Fowler
Martin Fowler
爱范儿
爱范儿
IT之家
IT之家
Last Week in AI
Last Week in AI
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
aimingoo的专栏
aimingoo的专栏
G
Google Developers Blog
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
The Cloudflare Blog
MyScale Blog
MyScale Blog
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
腾讯CDC
Microsoft Security Blog
Microsoft Security Blog

Moon's Blog

Java内存 | Moon's Blog Spring Data JPA | Moon's Blog Spring Boot的Java Config | Moon's Blog Java知识点 | Moon's Blog Spring Boot知识点 | Moon's Blog Java异常机制 | Moon's Blog Java的类加载器 | Moon's Blog JVM类加载机制 | Moon's Blog 单体架构与微服务架构 | Moon's Blog 888.公平的糖果棒交换 | Moon's Blog 839.相似字符串组 | Moon's Blog 778.水位上升的泳池中游泳 | Moon's Blog 1631.最小体力消耗路径 | Moon's Blog 724.寻找数组的中心索引 | Moon's Blog 使用Jackson库实现日期序列化 | Moon's Blog 使用Jackson库实现Java多态解析 | Moon's Blog Spring Boot+InfluxDB实现日志管理 | Moon's Blog Java多态+工厂模式实现服务调用 | Moon's Blog 为Spring Boot项目生成OpenAPI3.0文档 | Moon's Blog
424.替换后的最长重复字符 | Moon's Blog
Moon Lou · 2021-02-03 · via Moon's Blog

424.替换后的最长重复字符

题目

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

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

示例 1:

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

示例 2:

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

思路

首先,遇到这种类似于“求最长子字符串”的问题,就隐隐约约的感觉到滑动窗口(双指针)的影子了。

确实是使用双指针。两个指针均从字符串左端出发,每个迭代右指针右移一位,如果依然满足right - left + 1 <= k + maxCount,maxCount是字符的最大重复次数,则说明k还够用,左指针不动;如果不满足上式,说明k不够用了,左指针右移一位,从而维护好满足条件的最大区间长度。双指针移动的过程中区间长度绝不会变短。右指针是主动轮,左指针是从动轮(和二维迭代的本质区别,后者两个指针都是主动轮,从前往后遍历)。

在两个指针移动的过程中,维护好一个26个字母的数组,记录每个字母在当前区间中的出现次数,其中的最大值即为maxCount

因为双指针都是从前往后遍历一次,因此时间复杂度为O(n),n是字符串长度。

代码

复习双指针的写法(while判断条件)~

class Solution {
public int characterReplacement(String s, int k) {
int[] table = new int[26];
int left = 0;
int right = 0;
int maxCount = 0;
while (right < s.length()) {
table[s.charAt(right) - 'A']++;
maxCount = Math.max(maxCount, table[s.charAt(right) - 'A']);
if (right - left + 1 > k + maxCount) {
table[s.charAt(left) - 'A']--;
left++;
}
right++;
}
return right - left;
}
}

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Moon's Blog