424. Longest Repeating Character Replacement

本文介绍了一种使用滑动窗口解决字符串中字符替换问题的方法。通过计算窗口内字符的出现次数,判断是否可以通过限定数量的字符更改使得重复字符达到最长连续序列。文中详细解释了算法流程,并提供了一个C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

悲伤,一开始一点想法都没有,纠结于具体的更改方式,比如,给出[aba],k=1,如何成功找到b,让它变成a,然后可以得到最长重复为3。但是一直困扰于其算法实现的复杂度。看了看discuss,发现它是用滑窗的方式来计算的,返回最大窗长。具体思路为:
给出一个窗口,计算窗口中所有字符的个数n,并且统计窗口中出现次数最多的字符个数maxFre。如果n-maxFre大于等于可以更改的字符数k,那么这个窗就是个好窗。否则对窗户进行缩小,找到合适的窗口大小。

但是实际写代码的过程中,依旧有地方困扰着我。例如maxFre并不是[start,end]区间上出现重复次数最多的个数。而是存储历史最大maxFre。也就是说,窗长一直会在增长。只有所在区间的重复频率大于maxFre时,窗长才会增长。、
amazing。。。感觉很巧妙啊,非常规题目。

class Solution {
public:



    int characterReplacement(string s, int k) {

       int begin=0;
       int end=-1;
       int maxFre=0;
       int maxLength=0;
       map<char,int> count;

       while(1)
       {

            end++;//[start,end]

            if(end>=s.length())
                break;

            //maxFre=findMaxFre(s,begin,end);
            count[s[end]]++;

            if(maxFre<count[s[end]])
                maxFre=count[s[end]];

            //cout<<begin<<" "<<end<<endl;

            while(end-begin+1-maxFre>k)
            {
               count[s[begin]]--;
               begin++;
            }

            if(maxLength<end-begin+1)
                maxLength=end-begin+1;

       }

       return maxLength;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值