当前位置: 首页 > article >正文

在做题中学习(81):替换后的重复字符

解法:同向双指针————>滑动窗口

原因:     

        题目要求返回一个包含相同字母的最长字串,那就在数组中遍历找到,而又因为在暴力枚举时,会出现重复的情况,例如:在枚举以2为下标的子串时,长度结果已经在枚举下标为1的子串中记录了,因此不必做这种重复性的操作,只需定义l r两个指针,维护一个窗口进行同向的滑动即可。

思路:

        因为题目说明最多可以更换k次字符,因此,只要子串中 相同字符的数量(搞一个哈希表来维护) + k > 当前字串的长度即合法,当不合法时,进行窗口的挪动,看下面具体步骤:

滑动窗口步骤:

1.left = 0,right = 0;

2.进窗口  hash[s[r]]++ ;

3.出窗口 hash[s[l]]--;  l++;

4.更新结果 len = max(len,r - l + 1);

细节:

1. 上面思路说的判断条件 : 中的相同字符数量要搞清楚,要的是最多的相同字符个数,因为在窗口右移的过程中,可能后面新加进来的某个相同字符数量超过开始的那个字符的数量,那我们要做的其实是替换掉子串中出现次数少的字符。

因此:maxchar = max(maxchar,hash[s[r]])   来维护字串内的最多相同字符个数。

2.因为上面原因的分析,发现我们要的字串的长度要满足条件取决于 判断条件,而后我们其实可以发现,l++却决于窗口内字串不合法,而r++是一直在执行的,那就说明,有两种情况:

        1.l不动,r++

        2.l++后,紧跟着会r++

因此,窗口大小,要么不变,要么增大,因此len = max(len,r - l + 1)操作就没有意义了。

此题l不符合判断条件仅仅移动一步,r的话会一直++,和之前的滑动窗口题目有所不同,不需要l一直++以达到条件,注意。

完整代码如下:

ps:自己写的时候,还是用了max 取len的操作,因为这样万金油。

class Solution 
{
public:
    int characterReplacement(string s, int k) 
    {
        int hash[128] = {0};
        int maxcount = 0,len = 0;
        //维护[left,right)区间的滑动窗口是最大可以替换掉的字串长度
        for(int l = 0,r = 0;r<s.size();r++)
        {
            hash[s[r]]++;
            maxcount = max(maxcount,hash[s[r]]); //历史窗口中出现次数最多字母的次数。
            if(r - l + 1 > maxcount + k)
            {
                hash[s[l]]--;
                l++;
            }
            len = max(len,r - l + 1);
        }

        return len;
    }
};


http://www.kler.cn/a/522633.html

相关文章:

  • SpringCloud基础二(完结)
  • 开源 OA 办公系统
  • windows lm studio 0.3.8无法下载模型,更换镜像
  • 54.数字翻译成字符串的可能性|Marscode AI刷题
  • 代码随想录算法训练营第三十八天-动态规划-完全背包-322. 零钱兑换
  • vue2和vue3组件之间的通信方式差异
  • L30.【LeetCode题解】丢失的数字
  • 【无标题】TensorFlow、PyTorch、ONNX、TensorRT
  • 认知计算与 AI 大模型:数据仓库、数据湖与数据分析的变革力量
  • 《SwinIR:使用Swin-Transformer图像恢复》学习笔记
  • 深度解析:基于Vue 3与Element Plus的学校管理系统技术实现
  • LVGL+FreeRTOS实战项目:智能健康助手(lcd篇)
  • Java学习笔记(二十五)
  • Python面向对象编程实战:构建强大的 `Person` 类
  • CSS知识总结
  • zookeeper-3.8.3-基于ACL的访问控制
  • 私域流量池构建与转化策略:以开源链动2+1模式AI智能名片S2B2C商城小程序为例
  • Hive详细讲解-调优分区表速通
  • The Simulation技术浅析(二):模型技术
  • Python爬虫获取custom-1688自定义API操作接口
  • 【异步编程基础】FutureTask基本原理与异步阻塞问题
  • constexpr 实现编译时加密
  • Spark入门(Python)
  • python基础语法(4) ----- 学习笔记分享
  • 基于SpringBoot的网上摄影工作室开发与实现 | 含论文、任务书、选题表
  • 【JavaSE】String类常用字符串方法总结