算法——滑动窗口(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++】拷贝构造函数,析构函数详解!
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
终极指南:如何在Blender中无缝导入Rhino 3D文件
终极指南:如何在Blender中无缝导入Rhino 3D文件 【免费下载链接】import_3dm Blender importer script for Rhinoceros 3D files 项目地址: https://gitcode.com/gh_mirrors/im/import_3dm 你是否曾经在Rhino中创建了精美的3D模型,却无法直接在Bl…...
LFM2.5-1.2B-Instruct部署教程:基于Unsloth训练框架的轻量指令模型实践
LFM2.5-1.2B-Instruct部署教程:基于Unsloth训练框架的轻量指令模型实践 1. 模型介绍与适用场景 1.1 模型基本信息 LFM2.5-1.2B-Instruct是一个1.2B参数量的轻量级指令微调大语言模型,由Liquid AI基于Unsloth训练框架开发。这个模型专为边缘设备和低资…...
从5V到20V:手把手拆解一个PD快充头的‘讨价还价’逻辑(Power Negotiation实战)
从5V到20V:手把手拆解一个PD快充头的‘讨价还价’逻辑 当你把Type-C充电线插入MacBook的瞬间,屏幕右上角的充电图标会经历一场静默的"闪电谈判"——充电器与电脑在毫秒间完成电压、电流和功率的博弈。这场对话的幕后推手,正是USB P…...
【信奥业余科普】C++ 的奇妙之旅 | 15:让机器不知疲倦的秘密——循环语句背后的底层逻辑
在上一篇文章中,我们了解了 if-else 判断语句。依靠底层“程序计数器(PC)”的强制跳转功能,程序能够在遇到分岔路口时做出各种方向选择。然而,如果我们要让程序计算从 1 加到 1000 的和,或者让程序连续处理…...
实战分享:用uCharts在UniApp里做一个‘销售数据看板’,双Y轴混合图表是关键
实战分享:用uCharts在UniApp中构建电商销售数据看板 电商运营团队每天需要处理海量销售数据,如何快速直观地掌握业务动态成为关键挑战。最近在为一个服装电商平台开发管理后台时,我们遇到了一个典型需求:需要在一个Dashboard中同…...
Outfit字体终极指南:9种字重的专业几何无衬线字体实战
Outfit字体终极指南:9种字重的专业几何无衬线字体实战 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts Outfit字体是一款现代化的几何无衬线字体,专为品牌自动化公司Outfit…...
xhs-native-ops:AI内容生产的小红书原生运营技能包
1. 项目概述:一个面向小红书内容生产的“原生运营”技能包如果你正在用AI Agent(比如OpenClaw或Codex)做内容创作,尤其是针对小红书平台,那你大概率遇到过这样的困境:AI生成的内容,乍一看文字通…...
别再为仿真数据格式发愁!保姆级教程:为你的Livox Mid-360 Gazebo模型适配CustomMsg点云
深度解析Livox Mid-360仿真:从Gazebo建模到CustomMsg点云生成实战 在机器人感知算法开发中,激光雷达仿真一直是验证环节的关键瓶颈。特别是当硬件设备如Livox Mid-360面临供货紧张时,一套高保真的仿真方案不仅能加速研发进程,更能…...
RK3588 Sensor驱动调试踩坑记:从Media Controller找不到Entity到ISP Tuner不可用
RK3588 Sensor驱动调试实战:Media Controller与ISP Tuner问题深度解析 当你在RK3588平台上成功编译并加载了Sensor驱动,却发现media-ctl工具无法识别设备实体,或是ISP调校工具无法正常工作时,这种挫败感只有经历过的人才能体会。本…...
终极Windows和Office激活指南:KMS_VL_ALL_AIO完全解决方案
终极Windows和Office激活指南:KMS_VL_ALL_AIO完全解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗?Office突然变成只读模式让你束手…...

