leetcode424:替换后的最长重复字符

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

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

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

 

示例 1:

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

示例 2:

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

关键思路


要找最长子串,也就是说:存在一个窗口,正好包括这个子串,字符不多也不少。只有这样才能在替换k个字符的情况下得到一个连续最长子串。

所以:窗口内字符数 = 某字符出现次数 + k

class Solution:
    def characterReplacement(self, s: str, k: int) -> int:
        n = len(s)
        if n < 2:return n
        sArr = list(s)
        A = ord('A') # 返回对应的 ASCII 数值
        freq = [0 for _ in range(26)] # 初始化字符出现次数
        left = 0
        right = 0
        ans = 0
        curMax = 0

        while right < n:
            freq[ord(sArr[right]) - A] +=1 # 向右遍历统计字符出现次数
            curMax = max(curMax,freq[ord(sArr[right]) - A])  # 某字符最大出现次数
            right += 1

            if right - left > curMax + k: # 当窗口内所有字符数 > 某字符最大出现次数 + 替换字符数
                # 也就是说 当前窗口包括了多余的字符 缩小窗口大小
                freq[ord(sArr[left]) - A] -= 1 # 左指针指向的字符出现次数-1
                left += 1 # 左指针右移
        return max(ans,right - left)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值