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

系列文章目录

算法及数据结构系列 - 二分查找
算法及数据结构系列 - 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.mzph.cn/diannao/74252.shtml

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

相关文章

Android adb调试应用程序

启动app 有的时候app不是预先安装的&#xff0c;也不能从界面start一个app&#xff0c;这时需要后台拉起app。 $adb shell am start package.name/Activity.name 例如&#xff0c;android原生camera app&#xff0c; 包名为com.android.camera2&#xff0c; mainActivity名为…

Java EE(15)——网络原理——TCP协议解析一

一.确认应答/(确认)序列号 接收方接收到数据后&#xff0c;向发送方返回一个确认信号(ack)&#xff0c;告诉发送方数据被成功接收。ACK报文段只是作为确认使用的&#xff0c;一般来说不携带应用层数据&#xff08;载荷&#xff09;&#xff0c;也就是说只有报头部分。但有可能…

node-ddk,electron 组件, 打开新窗口

node-ddk 打开新窗口 https://blog.csdn.net/eli960/article/details/146207062 也可以下载demo直接演示 http://linuxmail.cn/go#node-ddk 本文讲解如何在渲染进程发起创建新窗口, 包括 window.open 在主进程定义窗口类型 import main, { NODEDDK } from "node-ddk…

git管理时keil项目忽略文件列表

在使用 Git 管理 Keil MDK&#xff08;μVision 5&#xff09;工程时&#xff0c;需要忽略编译生成的临时文件、调试文件、用户配置等非必要内容。以下是忽略文件的详细列表及说明&#xff0c;可直接保存为 .gitignore 文件&#xff1a; Keil MDK 工程的 .gitignore 文件 giti…

C#单例模式

单例模式 (Singleton),保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问&#xff0c;但它不能防止你实例化对个对象&#xff0c;一个最好的办法就是&#xff0c;让类自身负责保护它的唯一实例。这个类可以保证没…

ZYNQ的cache原理与一致性操作

在Xilinx Zynq SoC中&#xff0c;Cache管理是确保处理器与外部设备&#xff08;如FPGA逻辑、DMA控制器&#xff09;之间数据一致性的关键。Zynq的ARM Cortex-A9处理器包含L1 Cache&#xff08;指令/数据&#xff09;和L2 Cache&#xff0c;其刷新&#xff08;Flush/Invalidate&…

Linux NFS、自动挂载与系统启动管理指南

1. NFS客户端挂载导出的目录的方式 NFS&#xff08;网络文件系统&#xff09; 允许将远程服务器的目录挂载到本地&#xff0c;像访问本地文件一样操作远程文件。挂载方式主要有两种&#xff1a; 手动挂载&#xff1a;使用 mount 命令&#xff08;临时生效&#xff0c;重启后丢…

NO.55十六届蓝桥杯备战|排序|插入|选择|冒泡|堆|快速|归并(C++)

插⼊排序 插⼊排序(Insertion Sort)类似于玩扑克牌插牌过程&#xff0c;每次将⼀个待排序的元素按照其关键字⼤⼩插⼊到前⾯已排好序的序列中&#xff0c;按照该种⽅式将所有元素全部插⼊完成即可 #include <iostream> using namespace std; const int N 1e5 10; …

【Oracle资源损坏类故障】:详细了解坏块

目录 1、物理坏块与逻辑坏块 1.1、物理坏块 1.2、逻辑坏块 2、两个坏块相关的参数 2.1、db_block_checksum 2.2、db_block_checking 3、检测坏块 3.1、告警日志 3.2、RMAN 3.3、ANALYZE 3.4、数据字典 3.5、DBVERIFY 4、修复坏块 4.1、RMAN修复 4.2、DBMS_REPA…

计算机网络高频(二)TCP/IP基础

计算机网络高频(二)TCP/IP基础 1.什么是TCP/IP⭐⭐ TCP/IP是一种网络通信协议,它是互联网中最常用的协议之一。TCP/IP有两个基本的协议:TCP(传输控制协议)和IP(互联网协议)。 TCP(Transmission Control Protocol,传输控制协议)是一种可靠的、面向连接的协议。它负…

【大模型算法工程】大模型应用工具化、忠诚度以及知识库场景下PDF双栏解析问题的讨论

1. 大模型时代应用工具化以及无忠诚度现象讨论 接触大模型久了&#xff0c;也慢慢探到一些大模型能力表现非常自然和突出的场景&#xff0c;比如AI搜索&#xff08;依赖大模型的理解总结能力&#xff09;、AI对话&#xff08;即chat&#xff0c;依赖大模型的生成能力&#xff0…

Java EE(13)——网络编程——UDP/TCP回显服务器

前言 本文主要介绍UDP和TCP相关的API&#xff0c;并且基于这两套API实现回显服务器 UDP和TCP UDP和TCP属于网络五层模型中传输层的协议 特点&#xff1a; UDP&#xff1a;无连接&#xff0c;不可靠&#xff0c;面向数据包&#xff0c;全双工 TCP&#xff1a;有连接&#xff…

【蓝桥杯】12111暖气冰场(多源BFS 或者 二分)

思路 这题可以用BFS做&#xff0c;也可以用二分来做。 用二分这里只提供一个思路&#xff1a;对时间来二分查找&#xff0c;check函数就是检查在特定的时间 t 0 t_0 t0​内每一个暖气炉的传播距离能否覆盖所有格子。 用BFS做&#xff1a; 由几个点开始向外扩散&#xff0c;知道…

使用bat批量获取WORD中包含对应字符的段落,段落使用回车换行

get_word_paragraphs.vbs 获取命令行参数 If WScript.Arguments.Count 0 ThenWScript.Quit 1 End If 获取 Word 文档路径 docPath WScript.Arguments(0) 创建 Word 应用程序对象 Set objWord CreateObject("Word.Application") objWord.Visible False 打开 Word …

DeepSeek自学手册:《从理论(模型训练)到实践(模型应用)》|73页|附PPT下载方法

导 读INTRODUCTION 今天分享是由ai呀蔡蔡团队带来的DeepSeek自学手册&#xff1a;《从理论&#xff08;模型训练&#xff09;到实践&#xff08;模型应用&#xff09;》&#xff0c;这是一篇关于DeepSeek模型训练、应用场景及替代方案的综合指南文章&#xff0c;主要介绍了Deep…

WEB API 设计规范

REST API 简介 REST 是 Representational State Transfer 的缩写&#xff0c;它将资源作为核心概念&#xff0c;通过 HTTP 方法对资源进行操作。其本身是一套围绕资源进行操作的架构规范。在实际应用中&#xff0c;更多的是体现在 API 的设计上。 企业在进行产品设计开发时&a…

QT软件匠心开发,塑造卓越设计服务

在当今这个数字化飞速发展的时代&#xff0c;软件已经成为我们生活中不可或缺的一部分。而QT&#xff0c;作为一款跨平台的C图形用户界面应用程序开发框架&#xff0c;凭借其强大的功能和灵活性&#xff0c;在众多软件开发工具中脱颖而出。我们深知&#xff0c;在软件开发领域&…

标贝科技入选2025年市级数据要素市场化配置改革“揭榜挂帅”名单

近日&#xff0c;山东省大数据局、青岛市大数据局公布2025年数据要素市场化配置改革“揭榜挂帅”名单。标贝科技联合崂山区电子政务和大数据中心申报的“政务热线通话录音数据价值挖掘与权益保护”项目成功入选。这一成果不仅彰显了标贝科技在数据领域的创新实力&#xff0c;更…

Flutter TextField 从入门到精通:掌握输入框的完整指南

目录 1. 引言 2. TextField 的基本用法 3. 主要属性 4. 自定义 TextField 样式 4.1 自定义边框与提示文本 4.2 增加前缀/后缀图标 4.3 只允许输入数字 4.4 表单验证系统 4.5 动态样式修改 4.6 防抖搜索&#xff08;Debounce&#xff09; 5. 结论 相关推荐 1. 引言…

蓝桥杯备赛 背包问题

背包问题 ![[背包问题.png]] 01背包 1.题意概要&#xff1a;有 n n n个物品和一个容量为 V V V的背包&#xff0c;每个物品有重量 w i w_i wi​和价值 v i v_i vi​ 两种属性&#xff0c;要求选若干物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容…