算法通关村16关 | 滑动窗口最长字串专题

news2024/11/17 17:33:40

1. 最长字串专题

1.1 无重复字符的最长字串

题目

LeetCode3 给定一个字符串s,请你找出其中不含有重复字符的最长字串的长度。

思路

        找最长字串,需要知道所有无重复字串的首和尾,找出其中最长的,最少两个指针才可以完成,可以使用滑动窗口思想,结合Map使用。

用map的key表示当前正在访问的字符串,value是其下标的索引值,每访问一个新元素,就将其value更新为对应的索引值。

        left的位置需要处理,当第二次遇到a的时候,需要将left的位置向前移动一位,然后再更新a的value,用代码表示left的位置map.get('a') + 1 ,优化后是map.get(s.chat(i)) + 1,

        需要考虑特殊情况,例如abba,第二次访问b时候,left=map.get('b') + 1=2,再访问第二个a的时候,因为a重复了,所以left=map.get('a') + 1=1,left后退了,我们应该保持left在2的基础上继续向前,或者保持不变 ,也就是:left=Math.max(left,map.get(s.charAt(i)) + 1);

代码

    /**
     * Hash存储
     * @param s
     * @return
     */
    public static int lengthOfLongestSubtring2(String s){
        if (s.length() == 0) return 0;
        HashMap<Character, Integer> map = new HashMap<>();
        int max = 0;
        int left = 0;
        for (int right = 0; right < s.length(); right++) {
            if (map.containsKey(s.charAt(right))){
                left = Math.max(left,map.get(s.charAt(right)) + 1);
            }
            map.put(s.charAt(right),right);
            max = Math.max(max,right - left + 1);
        }
        return max;
    }

1.2 最多包含两个不同字符的最长字串

题目

给定一个字符串s,找出至多包含两个不同字符的最长字串t,并返回该字串的长度,LeetCode159.

思路

        类似于上题的方法,用left和right锁定一个窗口,一边移动一边分析,用map存储窗口中元素的个数,每次map中的key代表字符,value是最新字符的下标,

怎么保证只有两个不同字符?

当map.size=3的时候需要删除其中的最小value,也就是最左边的字符,左指针要移动的位置是删除位置索引+1。

del_idx = Collections.min(hashmap.values())

left = del_idx + 1.

代码中也有注释。

代码

    public int lengthOfLongestSubstringTwoDIstinct(String s){
        if (s.length() < 3){
            return s.length();
        }
        int left = 0, right = 0;
        HashMap<Character, Integer> hashmap = new HashMap<>();
        int maxLen = 2;

        while (right < s.length()){
            if (hashmap.size() < 3){
                //map大小于3的时候,右指针向前移动,并更新已有字符最新的下表索引
                hashmap.put(s.charAt(right),right++);
            }
            //如果大小达到了3个
            if (hashmap.size() == 3){
                //删除最左侧的位置,最小的索引
                int del_idx = Collections.min(hashmap.values());
                hashmap.remove(s.charAt(del_idx));
                //窗口left的新位置
                left = del_idx + 1;
            }
            maxLen = Math.max(maxLen,right - left);
        }
        return maxLen;
    }

1.3 至多包含k个不同字符的最长字串。

题目

两个不同字符升级为k个不同字符,LeetCode340题,给定字符串,找出至多包含k个不同字符的最长字串T。

思路

与两个不同字符串一样,map的最大长度为k,

代码

    public int lengthOfLongestSubstringKDIstinct(String s, int k){
        if (s.length() < k + 1){
            return s.length();
        }
        int left = 0, right = 0;
        HashMap<Character, Integer> map = new HashMap<>();
        int maxLen = k;
        while (right < s.length()){
            if (map.size() < k + 1){
                map.put(s.charAt(right), right++);
            }
            //如果大小达到了k,删除最左侧的
            if (map.size() == k + 1){
                int del_idx = Collections.min(map.values());
                map.remove(s.charAt(del_idx));
                left = del_idx + 1;
            }
            maxLen = Math.max(maxLen, right - left);
        }
        return maxLen;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/972441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

冠达管理:创业板是二板市场吗?二板市场起什么作用?

说到股市的各买卖板块&#xff0c;适当一部分投资者简单被主板、二板、三板这些词绕晕&#xff0c;其中二板商场一词关于有些投资者来说是比较生疏的&#xff0c;但面对创业板这一个不是主板但也没有说明是哪个层级的板块却熟悉许多&#xff0c;那么&#xff0c;创业板是不是便…

MySQL忘记密码了怎么办?如何重置修改密码?(Windows图文教程)

1. 如果服务在启动中&#xff0c;先停止MySQL服务 打开cmd&#xff0c;在命令窗口中输入net stop mysql 2. 跳过密码登录MySQL服务 mysqld --console --skip-grant-tables --shared-memory 输入以上代码 再次打开一个新的cmd窗口&#xff0c;原来的窗口不能关闭 在新的cmd窗口中…

冠达管理:股票隔夜挂单是怎么回事?股票挂单规则?

股票的买卖时刻是周一至周五上午9:30-11:30&#xff0c;下午13:00-15:00&#xff0c;一般投资者都是买卖日早上挂单&#xff0c;但也有一些投资者会在晚上隔夜挂单.那么&#xff0c;股票隔夜挂单是怎么回事&#xff1f;股票挂单规矩是什么&#xff1f;冠达管理为我们准备了相关…

C语言malloc函数学习

malloc的全称是memory allocation&#xff0c;中文叫动态内存分配&#xff0c;用于申请一块连续的指定大小的内存块区域&#xff0c;以void*类型返回分配的内存区域地址&#xff1b; 函数原型为void *malloc(unsigned int size)&#xff0c;在内存的动态存储区中分配一个长度为…

Python 内置函数详解 (1) 数学运算

近期在外旅游,本篇是出发前定时发布的,不完整,旅游回来后再补充。 Python 内置函数 Python3.11共有75个内置函数,其来历和分类请参考:Python 新版本有75个内置函数,你不会不知道吧_Hann Yang的博客-CSDN博客 函数列表 abs aiter all …

ESXI安装vCenter Server(VCSA)

概念说明ESXI安装 https://blog.csdn.net/tongxin_tongmeng/article/details/129466704 注意&#xff1a;ESXI-->主机-->硬件-->DSN服务器和网关信息-->VCSA安装时需要使用 VCSA下载 https://customerconnect.vmware.com/cn/home 注意&#xff1a;VCSA版本与ESXI版…

【Redis专题】Redis核心数据结构实战与高性能原理解析

目录 前言课程内容一、redis数据类型1.1 字符串&#xff08;string&#xff09;类型&#xff1a;比较简单的一种使用存储模型常用命令&#xff1a;&#xff08;截取自【菜鸟教程】&#xff09;部分演示应用场景 1.2 哈希&#xff08;hash&#xff09;类型&#xff1a;同类数据归…

01_Flutter之下拉刷新和上拉加载

一.创建页面 由于我们需要请求网络&#xff0c;并将返回的数据渲染到页面上&#xff0c;所以需要继承StatefulWidget&#xff0c;本文涉及的接口&#xff0c;取自鸿神的玩android开放API class ProjectListPage extends StatefulWidget {overrideState<StatefulWidget>…

亲测有效:虚拟机安装gcc,报错Could not retrieve mirrorlist http://mirrorlist.centos.org

&#xff08;网卡配置资料&#xff09; 原因&#xff1a; 网络问题 报错详情&#xff1a; One of the configured repositories failed (未知),and yum doesnt have enough cached data to continue. At this point the onlysafe thing yum can do is fail. There are a few …

【科普向】Jmeter 如何测试接口保姆式教程

现在对测试人员的要求越来越高&#xff0c;不仅仅要做好功能测试&#xff0c;对接口测试的需求也越来越多&#xff01;所以也越来越多的同学问&#xff0c;怎样才能做好接口测试&#xff1f; 要真正的做好接口测试&#xff0c;并且弄懂如何测试接口&#xff0c;需要从如下几个…

Autofac使用(1)

1.Nuget引入程序包 2.得到容器的建造者 3.配置抽象和具体类之间的关系 4.Build一下得到容器实例 5.基于容器来获取对象的实例了 1、基础使用 ContainerBuilder containerBuilder new ContainerBuilder(); containerBuilder.…

LeetCode 热题 100——找到字符串中所有字母异位词(滑动窗口)

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 该题目的意思简而言之就是说&#xff0c;从s字符串中寻找与p字符串含有相同字符(次数和种类均相同)的子串&#xff0c;并且将他们的首字符下标集合进数组中进行返回。 滑动窗口解…

arm64架构的linux中断分析

文章目录 1. 中断的概念和作用2. Linux中断处理机制2.1 中断请求2.2 中断处理2.3 中断完成2.4.中断触发和处理步骤详解2.4.1 异常向量表的解读 3. GICv3中断控制器3.1 GICv3中断控制器设备树3.2 GICv3中断控制器驱动 4. GIC的下一级中断控制器4.1 设备树4.2 内核对设备树的处理…

数学建模--退火算法求解最值的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 """ 1.设定退火算法的基础参数 2.设定需要优化的函数,求解该函数的最小值/最大值 3.进行退火过程&#xff0c;随机产生退火解并且纠正,直到冷却 4.绘制可视化图片进行了解退火整体过程 &…

Cyber RT学习笔记---2.基础概念汇总

2.基础概念汇总 在前面我们介绍了Cyber RT的基础介绍以及框架方面的知识&#xff0c;我们对Cyber RT是一个什么样的系统和框架有了一个大概的认知。这节我们将介绍一下Cyber RT中的一些基础且关键的概念&#xff0c;搞清楚这些概念所代表的意义以及作用&#xff0c;之后我们再…

2023年9月DAMA-CDGA/CDGP数据治理认证火热招生中

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

Android列表片段

下面创建第二个片段WorkoutFragment&#xff0c;它包含不同训练项目构成的一个列表&#xff0c;用户可以从这个列表中选择训练项目。 列表视图是只包含一个列表的片段 列表片段是一种专门处理列表的片段&#xff0c;它会自动绑定到一个列表视图&#xff0c;所以不需要另外创建…

【 Tkinter界面-练习03】实现动画

一、说明 在本教程中&#xff0c;我们将学习Python Tkinter Animation。在这里&#xff0c;我们将了解如何在 python 中使用 Tkinter 创建动画&#xff0c;并将介绍与动画相关的不同示例。我们还将讨论这些主题 二、Python Tkinter 动画 在本节中&#xff0c;我们将学习 Python…

服务器数据恢复- Ext4文件系统分区挂载报错的数据恢复案例

Ext4文件系统相关概念&#xff1a; 块组&#xff1a;Ext4文件系统的空间被划分为若干个块组&#xff0c;每个块组内的结构大致相同。 块组描述符表&#xff1a;每个块组都对应一个块组描述符&#xff0c;这些块组描述符统一放在文件系统的前部&#xff0c;称为块组描述符表。每…

【python爬虫】15.Scrapy框架实战(热门职位爬取)

文章目录 前言明确目标分析过程企业排行榜的公司信息公司详情页面的招聘信息 代码实现创建项目定义item 创建和编写爬虫文件存储文件修改设置 代码实操总结 前言 上一关&#xff0c;我们学习了Scrapy框架&#xff0c;知道了Scrapy爬虫公司的结构和工作原理。 在Scrapy爬虫公司…