算法——滑动窗口(Sliding Window)
一、背景知识
- 滑动窗口算法(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数组里该字母的个数加1if (Arrays.equals(sCount, pCount)) {//找到异位词ans.add(i + 1);}}return ans;}
}
相关文章:
算法——滑动窗口(Sliding Window)
一、背景知识 滑动窗口算法(Sliding Window): 在给定数组 / 字符串上维护一个固定长度或不定长度的窗口。可以对窗口进行滑动操作、缩放操作,以及维护最优解操作。题型一:固定长度题型二:不固定长度 二、例…...
Android异步之旅:探索AsyncTask
前言: 在Android应用程序开发中,异步操作是非常常见的需求。比如,我们可能需要在后台线程中执行网络请求、数据库操作或者其他耗时的任务,而不阻塞UI线程。为了实现这些异步操作,Android提供了多种方式,其…...
kibana 7安装
手动安装 下载 wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.15-linux-x86_64.tar.gz 解压 mv kibana-7.17.15-linux-x86_64.tar.gz /usr/local tar -zxvf kibana-7.17.15-linux-x86_64.tar.gz chown -R es:es kibana-7.17.15-linux-x86_64修改配置 s…...
为何内存不够用?微服务改造启动多个Spring Boot的陷阱与解决方案
在生产环境中我们会遇到一些问题,此文主要记录并复盘一下当时项目中的实际问题及解决过程。 背景简述 最初系统上线后都比较正常风平浪静的。在系统运行了一段时间后,业务量上升后,生产上发现java应用内存占用过高,服务器总共64…...
大模型变身双面人:虚假新闻制造机VS假新闻鉴别大师!
大家是怎样看待大型语言模型生成信息的可靠性呢? 尽管大语言模型生成的内容“像模像样”,但这些模型偶尔的失误揭示了一个关键问题:它们生成的内容并不总是真实可靠的。 那么,这种“不保真”特性能否被用来制造虚假信息呢&#x…...
WordPress网站如何修复数千个帖子的SEO错误
在本教程中,我们将向您展示如何解决您经常犯的SEO错误。 最好的是您不必花费太多时间,因为您不需要打开并编辑每个帖子。 相反,我们将向您展示如何使用 WordPress 内的电子表格来修复 WordPress 帖子的 SEO。 在这里,我们为您提…...
Mac如何搭建Vue项目
目录 一、安装node 二、安装NPM 1、本地安装和全局安装 2、通过Node.js官方安装程序安装 3、通过Homebrew安装 三、NPM常用命令 1、查看模块的版本号 2、安装指定版本 3、卸载模块 4、更新模块 5、查看模块信息 6、查看模块地址 7、更新命令 8、卸载NPM 四、安装…...
深入 Django 的 URL 分发器
概要 在 Django 的 MVC 架构中,URL 分发器扮演着至关重要的角色,它负责将用户的请求路由到相应的视图函数或类。这一机制不仅保证了 Django 应用的高度可扩展性,还为开发者提供了灵活的 URL 设计能力。本文将详细介绍 Django 中的 URL 分发器…...
基于单片机设计的气压与海拔高度检测计(采用MPL3115A2芯片实现)
一、前言 随着科技的不断发展,在许多领域中,对气压与海拔高度的测量变得越来越重要。例如,对于航空和航天工业、气象预报、气候研究等领域,都需要高精度、可靠的气压与海拔高度检测装置。针对这一需求,基于单片机设计…...
云原生入门系列(背景和驱动力)
做任何一件事,或者学习、应用一个领域的技术,莫过于先要想好阶段的目标和理解、学习它的意义是什么?解决了什么问题? 这部分,就尝试来探讨下这个阶段需要理解并达成的目标以及践行云原生的意义在哪里。 1.历程 任何阶…...
Django中间件
目录 一.介绍 1.什么是Django中间件 2.作用: 3.示例 二.Django请求生命周期流程图 三.Django中间件是Django的门户 四.中间件方法 1.必须掌握的中间件方法 (1)process_request: 示例: 2.需要了解的中间件方法 &#x…...
redis运维(十九)redis 的扩展应用 lua(一)
一 redis 的扩展应用 lua redis如何保证原子操作 说明:引入lua脚本,核心解决原子性问题 ① redis为什么引入lua? lua脚本本身体积小,启动速度快 ② redis引入lua的优势 小结: 类似自定义redis命令 ③ redis中如何使用lua ④ EVAL 说明&#…...
SpringBoot——MVC原理
优质博文:IT-BLOG-CN 一、SpringMVC自动配置 SpringMVC auto-configuration:SpringBoot自动配置好了SpringMVC。以下是SpringBoot对SpringMVC的默认配置:[WebMvcAutoConfiguration] 【1】包括ContentNegotiatingViewResolver和BeanNameView…...
[Linux] shell条件语句和if语句
一、条件语句 1.1 测试 test 测试文件的表达式是否成立 格式:test 条件表达式 [ 条件表达式 ] 选项作用-d测试是否为目录-e测试目录或文件是否存在-a测试目录或文件是否存在-f测试是否为文件-r测试当前用户是否有权限读取-w测试当前用户是否有权限写入-x测试当前…...
【陈老板赠书活动 - 18期】-如何成为架构师这几本书推荐给你
陈老老老板🦸 👨💻本文专栏:赠书活动专栏(为大家争取的福利,免费送书) 👨💻本文简述:生活就像海洋,只有意志坚强的人,才能到达彼岸。 👨&am…...
chrome 插件 Mobile simulator
谷歌浏览器插件Mobile simulator v3.8.2.0-2023-4-27(做屏幕适应的前端工具)-(Chrome插件)谷歌浏览器插件网 百度网盘:https://pan.baidu.com/s/1xVyny8CtlMjSchhTIlfRAA 提取码:cj5c...
JavaScript框架 Angular、React、Vue.js 的全栈解决方案比较
在 Web 开发领域,JavaScript 提供大量技术栈可供选择。其中最典型的三套组合,分别是 MERN、MEAN 和 MEVN。前端框架(React、Angular 和 Vue)进行简化比较。 MERN 技术栈详解 MERN 技术栈包含四大具体组件: MongoDB&am…...
【Vue】核心特性(响应式)
响应式: 数据变化,视图自动更新 接下来使用一个例子来体现一下什么是响应式 案例一: 访问数据,视图自动更新 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…...
ESP32 http 请求
目录 参考教程1.使用的http连接2.使用Vscode-IDF创建http_request例程3.修改http_request_example_main.c函数4.已经获取到响应的数据 参考教程 ESP-IDF HTTP获取网络时间 1.使用的http连接 http://api.m.taobao.com/rest/api3.do?apimtop.common.getTimestamp请求可以得到…...
【C++】拷贝构造函数,析构函数详解!
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

