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

目录

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

解题思路:


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

题目链接:力扣424. 替换后的最长重复字符

给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。

在执行上述操作后,返回包含相同字母的最长子字符串的长度。

示例 1:

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

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

提示:

1 <= s.length <= 10^5
s 仅由大写英文字母组成
0 <= k <= s.length

解题思路:

题目给出的字符串全为大写字母,因此我们可以用一个一维数组来模拟当前字串的字母的数量,用双指针,每次移动右端点,将右端点字母添加进来,并求出当前字串的最多字母的数量,判断是否满足剩下的元素<= k,如果不满足代表无法实现,此时左端点进行缩进,并从一维数组中删除左端点的字母,直到实现位置,最后得到的一定是合法的,我们保留每次合法子串的最大值即可

class Solution {
public:
    int characterReplacement(string s, int k) {
        //模拟子串中26个字母的数量
        int a[26] = {0}, ans = 0;
        //maxn是当前子串中最多字母的数量
        int n = s.size(), maxn = 0;
        //左右端点
        int l = 0, r = 0;
        while(r < n)
        {
            //每一次将右端点添加进模拟数组
            a[s[r]-'A']++;
            //计算出当前子串的最多字母数量
            maxn = max(maxn, a[s[r]-'A']);
            //如果子串长度减当前子串的最多字母数量要大于k,代表无法实现,将左端点一直移动直到可以实现的位置
            while(r-l+1 - maxn > k)
            {
                //所以删除最左侧元素,移动左端点
                a[s[l]-'A']--;
                l++;
            }
            //每次出了循环或没进循环代表此刻的子串一定合法,我们取最大值
            ans = max(ans, r-l+1);
            //移动右端点
            r++;
        }
        //返回字串长度
        return ans;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员shy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值