【算法刷题】leetcode hot 100 滑动窗口

文章目录

  • 3. 无重复字符的最长子串
  • 438. 找到字符串中所有字母异位词
  • 总结


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

在这里插入图片描述

  1. leetcode:https://leetcode.cn/problems/longest-substring-without-repeating-characters/?envType=study-plan-v2&envId=top-100-liked

  2. 滑动窗口

(1)右指针向右扩大窗口,直到不满足条件。
(2)左指针向右压缩窗口,直到满足条件。
(3)继续(1)-(2)操作,统计最大的窗口。

   public int lengthOfLongestSubstring(String s) {if (s == null || s.isEmpty()) {return 0;}int max = 0;int[] index = new int[128];int i = 0, j = 0;while (i <= j && j < s.length()) {if (index[s.charAt(j)] == 0) {index[s.charAt(j)]++;j++;}else {max = Math.max(max, j - i );index[s.charAt(i)]--;i++;}}max = Math.max(max, j - i );return max;}

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

在这里插入图片描述

  1. leetcode:https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envType=study-plan-v2&envId=top-100-liked

  2. 开始的想法:先给字符串p排个序,然后遍历s,取当前下标开始的长度和p相等的字符串,排序,和排过序的p进行比较,相等就符合条件。显然这种解法可行,但效率太低。

   public List<Integer> findAnagrams(String s, String p) {List<Integer> ans = new ArrayList<>();char[] ss = s.toCharArray();char[] ps = p.toCharArray();Arrays.sort(ps);for (int i = 0; i <= ss.length - ps.length; i++){char[] temp = s.substring(i, i + ps.length).toCharArray();Arrays.sort(temp);if (Arrays.equals(ps, temp)){ans.add(i);}}return ans;}
  1. 滑动窗口:

初始化计数器

  • 使用数组 pCount 记录字符串 p 中每个字符的频率。
  • 使用数组 sCount 记录当前窗口中字符的频率。

滑动窗口

  • 遍历字符串 s,逐步更新窗口。
  • 当窗口长度超过 p 的长度时,移除窗口左端的字符。

比较频率数组

  • 每次更新窗口后,比较 sCountpCount 是否相等。
  • 如果相等,则说明窗口中的子字符串是异位词,记录起始索引。
    public List<Integer> findAnagrams2(String s, String p) {List<Integer> ans = new ArrayList<>();int[] c1 = new int[26];int[] c2 = new int[26];for (char c : p.toCharArray()) {c1[c - 'a']++;}for (int i = 0; i < s.length(); i++) {c2[s.charAt(i) - 'a']++;// 移除窗口外的元素if (i >= p.length()) {c2[s.charAt(i-p.length()) - 'a']--;}if (Arrays.equals(c1, c2)) {ans.add(i-p.length()+1);}}return ans;}

总结

滑动窗口是一种常见的算法技巧,主要用于解决字符串、数组等线性数据结构中的子区间问题。通过维护一个动态更新的窗口(子区间),可以高效地找到问题的解。滑动窗口适合解决的问题通常具有连续性或者需要频繁更新子区间的性质。

滑动窗口的基本思想

  1. 定义一个窗口:
    • 通常用两个指针(leftright)来定义窗口的左右边界。
    • 窗口可以扩展(右边界向右移动)或收缩(左边界向右移动)。
  2. 移动窗口:
    • 根据问题要求,逐步移动右边界来扩展窗口。
    • 根据条件判断是否需要收缩左边界。
  3. 更新答案:
    • 在窗口满足某些条件时,更新答案(如最大值、最小值、计数等)。
  4. 窗口内数据结构:
    • 为了高效维护窗口状态,通常需要使用额外的数据结构(如数组、HashMapHashSet)来记录窗口内的数据。
int left = 0; // 窗口左边界
int right = 0; // 窗口右边界while (right < s.length()) { // 遍历字符串/数组// 扩展窗口(添加右边的元素)char c = s.charAt(right);right++;// 根据问题更新窗口内状态(如计数、频率等)while (窗口不满足条件) {// 收缩窗口(移除左边的元素)char d = s.charAt(left);left++;// 更新窗口内状态}// 如果窗口满足条件,更新答案
}

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

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

相关文章

企业级PHP异步RabbitMQ协程版客户端 2.0 正式发布

概述 workerman/rabbitmq 是一个异步RabbitMQ客户端&#xff0c;使用AMQP协议。 RabbitMQ是一个基于AMQP&#xff08;高级消息队列协议&#xff09;实现的开源消息组件&#xff0c;它主要用于在分布式系统中存储和转发消息。RabbitMQ由高性能、高可用以及高扩展性出名的Erlan…

基于SpringBoot的洗浴管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

直流无刷电机控制(FOC):电流模式

目录 概述 1 系统框架结构 1.1 硬件模块介绍 1.2 硬件实物图 1.3 引脚接口定义 2 代码实现 2.1 软件架构 2.2 电流检测函数 3 电流环功能实现 3.1 代码实现 3.2 测试代码实现 4 测试 概述 本文主要介绍基于DengFOC的库函数&#xff0c;实现直流无刷电机控制&#x…

51单片机——串口通信(重点)

1、通信 通信的方式可以分为多种&#xff0c;按照数据传送方式可分为串行通信和并行通信&#xff1b; 按照通信的数据同步方式&#xff0c;可分为异步通信和同步通信&#xff1b; 按照数据的传输方向又可分为单工、半双工和全双工通信 1.1 通信速率 衡量通信性能的一个非常…

oracle位运算、左移右移、标签算法等

文章目录 位运算基础与或非同或同或应用场景 异或异或应用场景 什么是真值表 oracle基础函数创建bitor(按位或)函数bitnot(按位非)函数bitxor(按位异或)函数左移函数BITSHIFT()函数(实测不可用&#xff0c;废弃掉该方案)右移函数(略&#xff0c;有此场景吗?) 实际应用资质字典…

VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署

近期有个工作需求是进行 YOLOv8 模型的 C 部署&#xff0c;部署环境如下 系统&#xff1a;WindowsIDE&#xff1a;VS2015语言&#xff1a;COpenCV 4.5.0OnnxRuntime 1.15.1 0. 预训练模型保存为 .onnx 格式 假设已经有使用 ultralytics 库训练并保存为 .pt 格式的 YOLOv8 模型…

python无需验证码免登录12306抢票 --selenium(2)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 [TOC](python无需验证码免登录12306抢票 --selenium(2)) 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 就在刚刚我抢的票&#xff1a;2025年1月8日…

本地手集博客id“升级”在线抓取——简陋版——(2024年终总结1.1)

我之前每每发布笔记都用csv纯文本记录&#xff0c;一个机缘巧得文章列表api实现在线整理自已的文章阅读量数据。 (笔记模板由python脚本于2025年01月10日 18:48:25创建&#xff0c;本篇笔记适合喜欢钻牛角尖的coder翻阅) 【学习的细节是欢悦的历程】 Python官网&#xff1a;htt…

工业 4G 路由器赋能远程医疗,守护生命线

在医疗领域&#xff0c;尤其是偏远地区的医疗救治场景中&#xff0c;工业 4G 路由器正发挥着无可替代的关键作用&#xff0c;宛如一条坚韧的 “生命线”&#xff0c;为守护患者健康持续赋能。 偏远地区医疗资源相对匮乏&#xff0c;常常面临着专业医生短缺、诊疗设备有限等困境…

【python基础——异常BUG】

什么是异常(BUG) 检测到错误,py编译器无法继续执行,反而出现错误提示 如果遇到错误能继续执行,那么就捕获(try) 1.得到异常:try的执行,try内只可以捕获一个异常 2.预案执行:except后面的语句 3.传入异常:except … as uestcprint(uestc) 4.没有异常:else… 5.鉴定完毕,收尾的语…

Nginx入门笔记

Nginx入门笔记 一、Nginx基本概念二、代理1、正向代理2、反向代理 三、准备工作1、CentOS 7安装nginx&#xff08;1&#xff09;. 安装必要的依赖&#xff08;2&#xff09;下载nginx&#xff08;3&#xff09;编译安装&#xff08;4&#xff09;编译并安装 Nginx(5)启动nginx …

半导体数据分析: 玩转WM-811K Wafermap 数据集(一) AI 机器学习

在半导体行业&#xff0c;工程师依靠 CP Yield&#xff08;生产过程中芯片的合格率&#xff09;、WAT&#xff08;晶圆验收测试&#xff09;和 Particle 的晶圆图模式来识别工艺问题。然而&#xff0c;在没有人工干预的情况下将这些晶圆图模式分类是一项重大挑战。许多论文都研…

初学者关于对机器学习的理解

一、机器学习&#xff1a; 1、概念&#xff1a;是指从有限的观测数据中学习(或“猜 测”)出具有一般性的规律&#xff0c;并利用这些规律对未知数据进行预测的方法.机器学 习是人工智能的一个重要分支&#xff0c;并逐渐成为推动人工智能发展的关键因素。 2、使用机器学习模型…

GPU算力平台|在GPU算力平台部署Qwen-2通义千问大模型的教程

文章目录 一、GPU平台介绍算力平台概述 二、人工智能应用开发需要GPU算力平台GPU算力原理账号注册流程Qwen-2通义千问大模型的部署登录/注册选择SettingsURL配置选择模型部署完成进行问答 一、GPU平台介绍 算力平台概述 GPU算力平台是一个专注于GPU加速计算的专业云服务平台&…

Vue3(elementPlus) el-table替换/隐藏行箭头,点击整行展开

element文档链接&#xff1a; https://element-plus.org/zh-CN/component/form.html 一、el-table表格行展开关闭箭头替换成加减号 注&#xff1a;Vue3在样式中修改箭头图标无效&#xff0c;可能我设置不对&#xff0c;欢迎各位来交流指导 转变思路&#xff1a;隐藏箭头&…

【C++】C++11(二)

目录 九、可变参数模板十、lambda表达式10.1 C98中的一个例子10.2 lambda表达式10.3 lambda表达式语法10.3.1 lambda表达式各部分说明10.3.2 捕获列表说明 10.4 函数对象与lambda表达式 十一、包装器11.1 function包装器11.2 bind 十二、线程库12.1 线程12.1.1 thread类的简单介…

针对数据库系统安全的漏洞扫描加固工具【WebSocket + MySQL】

一、系统背景 随着信息技术的迅猛发展和互联网的普及&#xff0c;数据库作为存储、管理和检索大量数据的关键组件&#xff0c;其安全性对于企业和组织来说至关重要。然而&#xff0c;由于网络环境的复杂性和攻击手段的多样性&#xff0c;数据库面临着越来越多的安全威胁&#…

Photon最新版本PUN 2.29 PREE,在无网的局域网下,无法连接自己搭建的本地服务器

1.图1为官方解答 2.就是加上这一段段代码&#xff1a;PhotonNetwork.NetworkingClient.SerializationProtocol SerializationProtocol.GpBinaryV16; 完美解决 unity 商店最新PUN 2 插件 不能连接 &#xff08;环境为&#xff1a;本地局域网 无外网情况 &#xff09; …

贪心算法(五)

目录 一、单调递增的数字 二、坏了的计算器 三、合并区间 四、无重叠区间 五、用最少数量的箭引爆气球 一、单调递增的数字 单调递增的数字 贪心策略&#xff1a; 对于这道题&#xff0c;相邻数字相等&#xff0c;也表示是递增的。 解题代码&#xff1a; class Soluti…

数据结构——栈的实现

今天&#xff0c;我们来写一下关于栈的博文。 1.首先我们先了解一下什么是栈&#xff1f; 一&#xff1a;概念&#xff1a; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另…