算法及数据结构系列 - 滑动窗口

news2025/3/24 15:59:06

系列文章目录

算法及数据结构系列 - 二分查找
算法及数据结构系列 - BFS算法
算法及数据结构系列 - 动态规划
算法及数据结构系列 - 双指针
算法及数据结构系列 - 回溯算法
算法及数据结构系列 - 树

文章目录

  • 滑动窗口
    • 框架思路
    • 经典题型
      • 76. 最小覆盖子串
      • 567. 字符串的排列
      • 438. 找到字符串中所有字母异位词
      • 3. 无重复字符的最长子串

滑动窗口

框架思路

/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
    unordered_map<char, int> need, window;
    for (char c : t) need[c]++;

    int left = 0, right = 0;
    int valid = 0; 
    while (right < s.size()) {
        // c 是将移入窗口的字符
        char c = s[right];
        // 右移窗口
        right++;
        // 进行窗口内数据的一系列更新
        ...

        /*** debug 输出的位置 ***/
        printf("window: [%d, %d)\n", left, right);
        /********************/

        // 判断左侧窗口是否要收缩
        while (window needs shrink) {
            // d 是将移出窗口的字符
            char d = s[left];
            // 左移窗口
            left++;
            // 进行窗口内数据的一系列更新
            ...
        }
    }
}

经典题型

76. 最小覆盖子串

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

示例:

输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
说明:

如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

提示:通过valid记录满足条件的字符数;只关注need中的字符
注意: Integer 类型比较 不能用 == !!!!, 要用 equals()

class Solution {
    public String minWindow(String s, String t) {
        int left = 0, right = 0;
        Map<Character, Integer> win = new HashMap<Character, Integer>();
        Map<Character, Integer> need = new HashMap<Character, Integer>();
        for(int i = 0; i< t.length(); i++){
            need.put(t.charAt(i), need.getOrDefault(t.charAt(i), 0) + 1);
        }
        int valid = 0;
        int start = -1, len = Integer.MAX_VALUE;
        while(right < s.length()){
            char c = s.charAt(right);
            right ++;
            if(need.containsKey(c)){
                win.put(c, win.getOrDefault(c, 0) + 1);
                if(win.get(c).equals( need.get(c))){ // 注意:不能用 ==
                    valid ++;
                }
            }
            while(valid == need.size()){
                if(right - left < len){
                    start = left;
                    len = right - left;
                }
                char d = s.charAt(left);
                left++;
                if(need.containsKey(d)){
                    if(win.get(d).equals(need.get(d))){
                        valid --;
                    }
                    win.put(d, win.get(d) - 1);
                }
            }
        }
        return start == -1? "":s.substring(start, start + len);
    }
}

567. 字符串的排列

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。

换句话说,第一个字符串的排列之一是第二个字符串的子串。

示例1:

输入: s1 = "ab" s2 = "eidbaooo"  
输出: True  
解释: s2 包含 s1 的排列之一 ("ba").  

示例2:

输入: s1= "ab" s2 = "eidboaoo"
输出: False
class Solution {
    public boolean checkInclusion(String s1, String s2) {
        int left = 0, right = 0;
        int[] win = new int[256];
        int[] need = new int[256];
        int needCharSize = 0;
        for(int i = 0 ; i< s1.length(); i++){
            if (need[s1.charAt(i)] == 0){
                needCharSize++;
            }
            need[s1.charAt(i)] ++;
        }
        int valid = 0;
        while(right < s2.length()){
            char c = s2.charAt(right);
            right++;
            if(need[c] > 0){
                win[c]++;
                if(need[c] == win[c]){
                    valid++;
                }
            }
            while(valid == needCharSize){
                if(right - left == s1.length()){
                    return true;
                }
                char d = s2.charAt(left);
                left++;
                if(need[d] > 0){
                    if(need[d] == win[d]){
                        valid--;
                    }
                    win[d]--;
                }
            }
        }
        return false;
    }
}

438. 找到字符串中所有字母异位词

给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。

说明:

字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。

class Solution {
    List<Integer> res = new ArrayList<Integer>();
    public List<Integer> findAnagrams(String s, String p) {
        int left = 0, right = 0;
        int[] win = new int[256];
        int[] need = new int[256];
        int needCharSize = 0;
        for(int i = 0; i< p.length();i++){
            char c = p.charAt(i);
            if(need[c] == 0){
                needCharSize++;
            }
            need[c]++;
        }
        int valid = 0;
        while(right < s.length()){
            char c = s.charAt(right);
            right++;
            if(need[c] > 0){
                win[c] ++;
                if(win[c] == need[c]){
                    valid ++;
                }
            }

            while(valid == needCharSize){
                if(right - left == p.length()){
                    res.add(left);
                }
                char d = s.charAt(left);
                left++;
                if(need[d] > 0){
                    if(need[d] == win[d]){
                        valid --;
                    }
                    win[d] --;
                }
            }
        }
        return res;
    }
}

3. 无重复字符的最长子串

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

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int left = 0, right = 0;
        int[] win = new int[256];
        int res = 0;
        while(right < s.length()){
            char c = s.charAt(right);
            right++;
            win[c]++;
            while(win[c] > 1){
                // 收缩以满足条件
                char d = s.charAt(left);
                left++;
                win[d]--;
            }
            // 满足条件更新结果
            res = Math.max(res, right - left);
        }
        return res;
    }
}

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

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

相关文章

关于VSCode使用过程中的一些问题记录(持续更新)

1. VSCode更新拒绝访问 VSCode安装更新的时候出现&#xff1a; D:\Program Files\Microsoft VS Code\tools\inno_updater.exe 尝试在目标目录创建文件时发生一个错误&#xff1a;拒绝访问。 解决方法&#xff1a; 1. 禁止VSCode的自动检查更新&#xff0c;操作方法&#xff…

重新复活的(手机端)一站式应用管理与下载平台

应用乐园&#xff08;安卓&#xff09; 应用乐园作者去年3月表示&#xff0c;由于精力问题&#xff0c;要停止维护奇妙搜索、应用乐园、奇妙影视这些软件了。 然而最近&#xff0c;令人意外的是&#xff0c;应用乐园竟然“复活”了&#xff01;更准确地说&#xff0c;它进行了…

Vue3前端开发:组件化设计与状态管理

Vue3前端开发&#xff1a;组件化设计与状态管理 一、Vue3组件化设计 组件基本概念与特点 是一款流行的JavaScript框架&#xff0c;它支持组件化设计&#xff0c;这意味着我们可以将页面分解成多个独立的组件&#xff0c;每个组件负责一部分功能&#xff0c;通过组件的嵌套和复用…

失物招领|校园失物招领系统|基于Springboot的校园失物招领系统设计与实现(源码+数据库+文档)

校园失物招领系统目录 目录 基于Springboot的校园失物招领系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、 管理员功能实现 (1) 失物招领管理 (2) 寻物启事管理 (3) 公告管理 (4) 公告类型管理 2、用户功能实现 (1) 失物招领 (2) 寻物启事 (3) 公告 …

Pear Admin Flask 开发问题

下载代码请复制以下命令到终端执行 git clone https://gitee.com/pear-admin/pear-admin-flask 于是我下载git 完成安装后&#xff1a; 安装 Git 后出现的页面是 “Git for Windows 的版本发布说明&#xff08;Release Notes&#xff09;”&#xff0c;通常会在安装完成后自动弹…

1996-2023年各省公路里程数据(无缺失)

1996-2023年各省公路里程数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1996-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;公路里程&#xff08;万公里&#xff09; 4、范围&#xff1a;31省 5、指标解释&#xff1a;公路里程指报告期末…

量化研究---可转债量化交易系统上线快速服务器

现在可转债交易系统使用的人多&#xff0c;服务器比较小&#xff0c;今天对服务器进行了升级&#xff0c;提供快速的数据支持&#xff0c;同时我也给了服务器的源代码&#xff0c;支持自定义服务器数据支持&#xff0c;不通过我服务器&#xff0c;可以挂在服务器上面24小时快速…

用ArcGIS做一张符合环评要求的植被类型图

植被类型图是环境影响评价&#xff08;环评&#xff09;中的重要图件&#xff0c;需满足数据准确性、制图规范性和信息完整性等要求。本教程将基于ArcMap平台&#xff0c;从数据准备到成果输出&#xff0c;详细讲解如何制作符合环评技术规范的植被类型图。 ArcGIS遥感解译土地…

Java 双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]

集合 关系 介绍 Deque 是一个接口 LinkedList 是这个接口的实现类 题目 输入输出 滑动窗口 基于双端队列实现 Deque<Integer> deque new LinkedList<>(); 滑动窗口代码 洛谷 public static List<Integer> maxSlidingWindow(int[] nums, int k) {List&l…

[学习笔记] VM虚拟机安装Ubuntu系统

前言 我现在装的Ubuntu总是死机&#xff0c;经常黑屏&#xff0c;所以我决定换个版本&#xff0c;顺便写一下笔记&#xff0c;给大家分享如何安装虚拟机 下载 这里我选择的是Ubuntu 22.04.5 LTS&#xff0c;下载链接&#xff1a;Ubuntu 22.04.5 LTS 如果访问不了网站的话&…

统计学重要概念:自由度

在统计学中&#xff0c;自由度&#xff08;degrees of freedom&#xff0c;简称df&#xff09;是一个重要的概念&#xff0c;它表示在计算某个统计量时可以自由变化的值的数量。对于一个样本量为n的样本&#xff0c;自由度通常为n-1&#xff0c;这是因为我们需要用样本数据来估…

为扣子智能体接入 DeepSeek

扣子现已推出满血版 DeepSeek 全家桶&#xff0c;支持免费体验 R1、V3 模型。除此之外&#xff0c;扣子支持 DeepSeek 思维链&#xff08;Chain-of-Thought&#xff0c;CoT&#xff09;和 Function Calling 能力&#xff0c;为你的智能体添加私有知识和多种技能&#xff0c;拓展…

Dear ImGui for Unity 常见问题解决方案

Dear ImGui for Unity 常见问题解决方案 dear-imgui-unity Unity package for Dear ImGui 项目地址: https://gitcode.com/gh_mirrors/de/dear-imgui-unity 1. 项目基础介绍 Dear ImGui for Unity 是一个开源项目&#xff0c;旨在将Dear ImGui库整合到Unity游戏引擎中。…

【Unity3D】摄像机适配场景以及Canvas适配

目录 宽度不变策略 高度不变策略 宽度不变策略 开发分辨率 750*1334 (宽高比:0.56) 真机分辨率 1170*2532 (宽高比:0.46) 真机宽高比<开发宽高比&#xff0c;采用宽度不变策略 理由&#xff1a;小于代表真机高度比开发高度更大&#xff0c;因此不需要担心高度上…

盛铂科技国产SLMF315超低相位噪声频率综合器介绍

SLMF315频率综合器简介&#xff1a; 盛铂科技SLMF315超低相位噪声频率综合器的频率范围覆盖200MHz至15GHz。频率的最小步进仅为0.1Hz&#xff0c;在不考虑频率精度的情况下频率步进可达0.04Hz。SLMF315内部采用多环路设计从而获得极优秀的相位噪声特性&#xff0c;频率输出为1…

SpringDoc和Swagger使用

目录 一、SpringDoc 1.添加依赖 2.配置代码 配置解释 &#xff08;1&#xff09;springdoc.api-docs.path &#xff08;2&#xff09;springdoc.swagger-ui.path &#xff08;3&#xff09;springdoc.swagger-ui.operationsSorter &#xff08;4&#xff09;springdoc.…

asp.net core mvc模块化开发

razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…

第2.2节 Android Jacoco插件覆盖率采集

JaCoCo&#xff08;Java Code Coverage&#xff09;是一款开源的代码覆盖率分析工具&#xff0c;适用于Java和Android项目。它通过插桩技术统计测试过程中代码的执行情况&#xff0c;生成可视化报告&#xff0c;帮助开发者评估测试用例的有效性。在github上开源的项目&#xff…

Vue3中router最佳封装落地

文章目录 前言一、拆分路由文件夹&#xff1f;二、main.ts中注册路由总结 前言 router在使用过程中如果我们直接在一个文件的一个数组中配置&#xff0c;最后路由越来越多会导致不易管理&#xff0c;我们可以将一个页面的路由配置在一个数组中最后统一导入&#xff0c;这样就会…

网络爬虫【爬虫库request】

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库&#xff0c;完全满足如今网络爬虫的需求。与Urllib对比&#xff0c;Requests不仅具备Urllib的全部功能&#xff1b;在开发使用上&…