算法——滑动窗口(Sliding Window)

news2025/1/15 17:44:09

一、背景知识

  • 滑动窗口算法(Sliding Window)
    • 在给定数组 / 字符串上维护一个固定长度或不定长度的窗口。可以对窗口进行滑动操作、缩放操作,以及维护最优解操作。
    • 题型一:固定长度
    • 题型二:不固定长度

 二、例题

1、无重复字符的最长子串(不定长度)

写法一: 我的答案

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.length()==0){
            return 0;
        }
        int l=0;//左指针
        int r=0;//右指针
        int maxLen=1;
        List<Character> list=new ArrayList<>();
        while(r<s.length() && l<s.length()){
            if(!list.contains(s.charAt(r))){
                list.add(s.charAt(r));//窗口右侧扩张
                maxLen=Math.max(maxLen,r-l+1);//维护一个子串长度的最大值
                r++;
            }else{
                int index=list.indexOf(s.charAt(r));//在窗口里查找被重复的字符的下标
                delItems(index,list);//把重复字符及其以前的字符移出窗口
                l=l+index+1;//窗口左侧收缩
            }
        }
        return maxLen;
    }
    //
    public void delItems(int end,List list){
        while(end>=0){//从后往前删
            list.remove(end);
            end--;
        }
    }
}

写法二: 官方答案

外循环(for)枚举字符串s的所有字符,当作滑动窗口的左边界,进入内循环(while)后,不断往右移,直到遇到重复的字符后,跳出内循环。

更新最长子串长度,删除滑动窗口最左边的一个元素。

如果该元素不是被重复的元素,就不会再次进入内循环,而是一直在外循环徘徊,一个接一个地删掉滑动窗口最左边的元素,直到删掉那个被重复的元素

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 哈希集合,记录每个字符是否出现过,相当于滑动窗口
        Set<Character> occ = new HashSet<Character>();
        int n = s.length();
        // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        int rk = -1, ans = 0;
        for (int i = 0; i < n; ++i) {
            if (i != 0) {
                // 左指针向右移动一格,哈希集合移除一个字符
                occ.remove(s.charAt(i - 1));
            }
            while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
                // 不断地移动右指针,哈希集合增加一个字符 
                occ.add(s.charAt(rk + 1));
                ++rk;
            }
            // 第 i 到 rk 个字符是一个极长的无重复字符子串
            // rk-i+1为当前滑动窗口内的子串长度
            ans = Math.max(ans, rk - i + 1);
        }
        return ans;
    }
}

2、找到字符串中所有字母异位词

该题用排序法会超时,用链表或哈希表会超出内存限制 

写法一:

突破点:

在字符串 s中构造一个长度为与字符串 p的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 p中每种字母的数量相同时,则说明当前窗口为字符串 p的异位词。

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        int sLen = s.length(), pLen = p.length();

        //当字符串 s 的长度小于字符串 p 的长度时,字符串 s 中一定不存在字符串 p 的异位词
        if (sLen < pLen) {
            return new ArrayList<Integer>();
        }

        List<Integer> ans = new ArrayList<Integer>();
        int[] sCount = new int[26];//计算字符串s中26个字母出现的个数
        int[] pCount = new int[26];//计算字符串p中26个字母出现的个数
        for (int i = 0; i < pLen; ++i) {
            ++sCount[s.charAt(i) - 'a'];
            ++pCount[p.charAt(i) - 'a'];
        }

        if (Arrays.equals(sCount, pCount)) {//两个数组相等,找到异位词
            ans.add(0);//记录初始下标
        }

        //窗口开始滑动
        for (int i = 0; i < sLen - pLen; ++i) {//用滑动窗口遍历字符串s
            --sCount[s.charAt(i) - 'a'];//滑动窗口左边界收缩,sCount数组里该字母的个数减1
            ++sCount[s.charAt(i + pLen) - 'a'];//滑动窗口右边界扩张,sCount数组里该字母的个数加1

            if (Arrays.equals(sCount, pCount)) {//找到异位词
                ans.add(i + 1);
            }
        }

        return ans;
    }
}

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

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

相关文章

spring-boot-admin-starter-server监控springboot项目

文章目录 场景实现具体操作展示 场景 监控三件套Prometheus、Grafana、Alertmanager 部署起来太复杂,如果公司没有运维而且项目很小就可以使用spring-boot-admin-starter-server替代。这个包使用起来还是很简单的, 下面就实现一个对springCloud项目的监控 实现 参考 项目 具体操…

一篇五分生信临床模型预测文章代码复现——Figure 10.机制及肿瘤免疫浸润(六)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

RabbitMQ快速入门(简单收发消息)

文章目录 前言一、数据隔离1.用户管理2.virtual host 二、控制台收发1.交换机2.队列3.绑定 三、编程式收发1.依赖和配置2.收发信息 总结 前言 1.了解数据隔离 2.RabbitMQ控制台收发信息 3.SpringBoot整合RabbitMQ收发信息 一、数据隔离 1.用户管理 点击Admin选项卡&#xff0…

配置静态 Eth-trunk

1、需求 1&#xff09;交换网络中存在2个 VLAN – 10 和 20 2&#xff09;每个VLAN的IP地址为&#xff1a;192.168.xx.0/24&#xff08;xx为 vlan 号&#xff09; 3&#xff09;对交换机之间的链路进行链路捆绑&#xff0c;增加互联带宽 4&#xff09;确保同 VLAN的 PC 之间互…

第十五章---I/O(输入/输出)

15.1输入输出流 流是一组有序的数据序列&#xff0c;根据操作的类型&#xff0c;可分为输入流和输出流两种。I/O(Input/Output,(输出)流提供了一条通道程序&#xff0c;可以使用这条通道把源中的字节序列送到目的地。虽然 I/O 流疆盘文件存取有关&#xff0c;但是程序的源和目…

Doris动态分区(十四)

动态分区是在 Doris 0.12 版本中引入的新功能。旨在对表级别的分区实现生命周期管理&#xff08;TTL&#xff09;&#xff0c;减少用户的使用负担。 目前实现了动态添加分区及动态删除分区的功能。动态分区只支持 Range 分区。 原理 在某些使用场景下&#xff0c;用户会将表…

坚鹏:湘潭市银行业协会BLM银行数字化转型战略培训圆满结束

在数字化转型背景下&#xff0c;湘潭市银行业协会为了落实监管政策《关于银行业保险业数字化转型的指导意见》&#xff0c;充分认识到学习银行银行数字化转型战略的价值和重要性&#xff0c;特别举办《2023年数字化转型战略专题培训班》。为了改变大家的认知&#xff0c;为了拓…

Ajax入门-Express框架介绍和基本使用

电脑实在忒垃圾了&#xff0c;出现问题耗费了至少一刻钟time&#xff0c;然后才搞出来正常的效果&#xff1b; 效果镇楼 另外重新安装了VScode软件&#xff0c;原来的老是报错&#xff0c;bug。。&#xff1b; 2个必要的安装命令&#xff1b; 然后建立必要的文件夹和文件&…

回转窑无线测温系统解决方案

方案概述&#xff08;以回转窑监测为例&#xff09; 回转窑通常使用在热电厂、钢铁厂、冶金厂及干燥设备行业。而这些行业一般具有高温、潮湿、粉尘、高压、不便布线或现场无法提供电源等环境特点。同时&#xff0c;回转窑在工作中&#xff0c;具有旋转、高温等特点。为此&…

upload-labs关卡12(基于白名单的%00截断绕过)通关思路

文章目录 前言一、靶场需要了解的前置知识1、%00截断2、0x00截断3、00截断的使用条件1、php版本小于5.3.292、magic_quotes_gpc Off 二、靶场第十二关通关思路1、看源代码2、bp抓包%00截断3、验证文件是否上传成功 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&…

使用Java Servlet生成动态二维码

文章目录 引入ZXing库创建QRCodeServlet部署到Servlet容器拓展功能1. 动态生成二维码内容2. 调整二维码尺寸3. 错误修正级别4. 日志输出 结语 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&…

虚拟主播解决方案

虚拟主播作为一种新兴的技术&#xff0c;正在逐渐改变我们的生活和工作方式。美摄科技&#xff0c;作为行业的领导者&#xff0c;致力于为企业提供一站式的虚拟主播技术解决方案&#xff0c;帮助企业实现数字化转型。 美摄科技的虚拟主播解决方案&#xff0c;是一种将文本内容…

Spark的通用运行流程与Spark YARN Cluster 模式的运行流程

Spark的通用运行流程 集群启动后Worker节点会向Master节点心跳汇报资源Client向Driver提交APP&#xff0c;根据不同的运行模式在不同的地方创建Driver。Driver以粗粒度的方式向Master注册应用并申请资源&#xff08;在Application执行之前&#xff0c;将所有的资源申请完毕&…

用spring发送http请求

在Spring中&#xff0c;你可以使用RestTemplate或WebClient来发送HTTP请求。下面分别给出使用这两个类的简单示例。 现在pom.xml中导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artif…

2023年中国边缘计算网关现状及发展趋势分析[图]

边缘计算网关是一种可以在设备上运行本地计算、消息通信、数据缓存等功能的工业智能网关&#xff0c;可以在无需联网的情况下实现设备的本地联动以及数据处理分析。边缘计算网关是一种连接物联网设备和云端服务的关键技术&#xff0c;它可以在设备和云端之间建立一个安全、高效…

CCF CSP认证 历年题目自练Day49

题目一 此题用暴力枚举做过&#xff08;80分&#xff09;现如今终于用二维前缀和做到满分。 试题编号&#xff1a; 202309-2 试题名称&#xff1a; 坐标变换&#xff08;其二&#xff09; 时间限制&#xff1a; 2.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 问题…

python基于GCN(图卷积神经网络模型)和LSTM(长短期记忆神经网络模型)开发构建污染物时间序列预测模型

在以往的时间序列预测建模中广泛使用的是回归类算法模型和RNN类的算法模型&#xff0c;相对来说技术栈会更稳定一些&#xff0c;最近有一个实际业务场景的需求&#xff0c;在建模的过程中要综合考虑其余点位的影响依赖&#xff0c;这时候我想到了之前做过的交通流量和速度预测相…

【软件测试】接口——基本测试流程

1、接口测试需求获取 &#xff08;1&#xff09;获取接口文档 &#xff08;2&#xff09;通过接口文档获取接口信息 &#xff08;3&#xff09;确认接口测试需求 2、 接口测试计划编写 &#xff08;1&#xff09;目标&#xff1a;确认需求、资源、方法、进度方案 &#x…

【VScode】安装配置、插件及远程SSH连接

一、VSCode安装 二、配置安装插件 三、配置远程连接SSH 四、MinGW 一、VSCode安装 VS官网 Visual Studio Code - Code Editing. Redefined下载安装包&#xff1a; 二、配置安装插件 安装中文插件 配置字体为20 配置文件–>首选项->设置->Font Size为20 设置 VSC…

想分析全国用电及煤气、液化石油气供应利用情况,这部分数据对你有帮助!

随着经济的发展和人民生活水平的提高&#xff0c;能源的需求量越来越大。其中&#xff0c;电力和煤气、液化石油气等能源的供应利用情况与我们的日常生活息息相关。 今天我们根据《中国城市统计年鉴》统计的中国地级及以上城市的煤气及液化石油气供应及利用情况的指标&#xff…