【leetcode-Python】-滑动窗口-424. Longest Repeating Character Replacement

题目链接

https://leetcode.com/problems/longest-repeating-character-replacement/

题目描述

给定仅由大写英文字母组成的字符串s,可以将任意位置上的字符替换为其他字符,最多可以替换k次。在执行上述操作后,找到包含重复字母的最长子串的长度。字符串长度和k不会超过10^4。

示例

输入:s = "AABABBA",k=1

输出:4

将中间的一个'A'替换为‘B’,字符串变为"AABBBBA". 子串"BBBB"有最长重复字母,因此答案为4.

解题思路

这类题是比较经典的滑动窗口问题。给定k,要想使替换后所有字符都一样,并且重复、连续的部分更长,我们应该替换出现次数最多字符以外的字符。由于我们找的是最长子串,那么如果窗口内能够在最多替换k个字符后所有的字符都相同,右边界就继续右移。如果不满足这个条件就固定右边界,开始移动左边界。

我们考虑两个问题:

(1)左指针开始移动的条件是什么?

右指针的每次移动需要使得窗口内的子数组能够满足最多替换k个字符后,所有的字符都相同。当右指针移动到窗口内最多出现的字符次数(记为max_occurence)+k<right-left时,替换k次也无法使得子数组内字符都相同,此时左指针开始移动。

(2)左右指针右移时要更新的数据有哪些?

左右指针右移时要更新新加入窗口的字符的出现次数。

下面举例s = "AABABBA",k=1来说明算法步骤:

由于窗口内元素只有A,不需要替换字符,因此更新最长重复子串长度为1,right可以继续右移。

窗口内元素为[A,A],不需要替换字符,因此更新最长重复子串长度为2,right继续右移。

窗口内元素为[A,A,B],由于窗口内出现次数最多的字符为A,出现次数为2次。2+k == right-left,将B替换为A即可得到重复子串"AAA"。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值