LeetCode热题100——滑动窗口/子串

文章目录

  • 1. 无重复字符的最长子串
    • 1.1 题目链接
    • 1.2 题目描述
    • 1.3 解题代码
    • 1.4 解题思路
  • 2. 找到字符串中所有字母异位词
    • 2.1 题目链接
    • 2.2 题目描述
    • 2.3 解题代码
    • 2.4 解题思路
  • 3、和为 K 的子数组
    • 3.1 题目链接
    • 3.2 题目描述
    • 3.3 解题代码
    • 3.4 解题思路
  • 4. 滑动窗口最大值
    • 4.1 题目链接
    • 4.2 题目描述
    • 4.3 解题代码
    • 4.4 解题思路
  • 5. 最小覆盖子串
    • 5.1 题目链接
    • 5.2 题目描述
    • 5.3 解题代码
    • 5.4 解题思路


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

1.1 题目链接

点击跳转到题目位置

1.2 题目描述

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

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

1.3 解题代码

class Solution {public int lengthOfLongestSubstring(String s) {int left = 0;int right = -1;int n = s.length();int len = 0;Set<Character> hash = new HashSet<Character>();while(right < n - 1){++right;char ch = s.charAt(right);if(!hash.contains(ch)){hash.add(ch);} else{while(hash.contains(ch)){hash.remove(s.charAt(left));++left;}hash.add(ch);}len = Math.max(len, right - left + 1);}return len;}
}

1.4 解题思路

  1. 滑动窗口解决该问题。
  2. 右指针右移,如果当前所指的字符不在集合里面,直接把该字符添加进字符中;如果当前所指的字符在集合里面,去除左指针所指的字符,并右移动,直到右指针所指的字符在集合中查询不到,最后再将右指针所指的字符添加进去。
  3. 再上述操作执行完毕后更新一下最长的长度。

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

2.1 题目链接

点击跳转到题目位置

2.2 题目描述

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
提示:

  • 1 <= s.length, p.length <= 3 * 104
  • s 和 p 仅包含小写字母

2.3 解题代码

class Solution {boolean judge(int[] hash1, int[] hash2){for(int i = 0; i < 26; ++i){if(hash1[i] != hash2[i]){return false;}}return true;}public List<Integer> findAnagrams(String s, String p) {List<Integer> res = new ArrayList<>();if(s.length() < p.length()){return res;}int[] hash1 = new int[26];int[] hash2 = new int[26];for(int i = 0; i < p.length(); ++i){hash1[s.charAt(i) - 'a']++;hash2[p.charAt(i) - 'a']++;}if(judge(hash1, hash2) == true){res.add(0);}int left = 0;int right = p.length() - 1;while(right < s.length() - 1){right++;hash1[s.charAt(left) - 'a']--;hash1[s.charAt(right) - 'a']++;left++;if(judge(hash1, hash2) == true){res.add(left);}}return res;}
}

2.4 解题思路

  1. 定长滑动窗口问题。
  2. 用哈希表来统计滑动窗口中各字符的数量,统计p字符的数量,如果字符数量相等,则将字符串中第一个字符的下标放入结果数组中。

3、和为 K 的子数组

3.1 题目链接

点击跳转到题目位置

3.2 题目描述

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。

提示:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107

3.3 解题代码

class Solution {public int subarraySum(int[] nums, int k) {HashMap<Integer, Integer> hash = new HashMap<>();int num = 0;int ret = 0;hash.put(0, 1);for(int i = 0; i < nums.length; ++i){num += nums[i];if(hash.containsKey(num - k)){ret += hash.get(num - k);}hash.put(num, hash.getOrDefault(num, 0) + 1);}   return ret;}
}

3.4 解题思路

  1. 哈希表+前缀和。
  2. 首先先将哈希表中0的个数设置为1。
  3. 每次统计当前前缀和,将哈希表中的值+1。
  4. 累计统计结果,每次加上当前哈希表中 前缀和 - k 的数量。

4. 滑动窗口最大值

4.1 题目链接

点击跳转到题目位置

4.2 题目描述

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104
  • 1 <= k <= nums.length

4.3 解题代码

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {Deque<Integer> deque = new LinkedList<Integer>();int n = nums.length;int[] ret = new int[n - k + 1];for(int i = 0; i < k; ++i){while(!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]){deque.pollLast();}deque.offerLast(i);}ret[0] = nums[deque.peekFirst()];for(int i = k; i < n; ++i){while(!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]){deque.pollLast();}deque.offerLast(i);while(!deque.isEmpty() && i - deque.peekFirst() + 1 > k){deque.pollFirst();}ret[i - k + 1] = nums[deque.peekFirst()]; }return ret;}
}

4.4 解题思路

  1. 使用双端队列解决问题,队列存放元素的下标。
  2. 先遍历前面k个元素,如果队列非空,并且当前的元素大于等于队尾的下标所对应的元素,则删除该元素(因为当前遍历的位置是滑动窗口末尾的元素,如果之前的元素不如当前元素值大,那么滑动窗口的最大值一定不是之前的元素)。之后将当前元素的下标存放进入队列的尾部。
  3. 结果数组第一位数即为队首元素。
  4. 之后从数组的第k位遍历到最后一位,前面的操作与2中操作一致,之后要对队首进行处理,如果队首的下标在当前滑动窗口的左边,则要删除队首元素,之后将滑动窗口内最大值(即为队首元素对应的元素)赋值给结果数组。

5. 最小覆盖子串

5.1 题目链接

点击跳转到题目位置

5.2 题目描述

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。

提示:

  • m == s.length
  • n == t.length
  • 1 <= m, n <= 105
  • s 和 t 由英文字母组成

5.3 解题代码

class Solution {public String minWindow(String s, String t) {HashMap<Character, Integer> hash = new HashMap<>();int left = 0;int right = -1;int m = s.length();int n = t.length();int idx = n;int min_len = m + 1;int ans = -1;for(int i = 0; i < n; ++i){hash.put(t.charAt(i), hash.getOrDefault(t.charAt(i), 0) + 1);}while(right < m - 1){right++;char ch = s.charAt(right);if(hash.containsKey(ch)){if(hash.get(ch) > 0){idx--;}hash.put(ch, hash.getOrDefault(ch, 0) - 1);if(idx == 0){while(left <= right){if(right - left + 1 < min_len){min_len = right - left + 1;ans = left;}     char ch1 = s.charAt(left);left++;if(hash.containsKey(ch1)){hash.put(ch1, hash.getOrDefault(ch1, 0) + 1);if(hash.get(ch1) > 0){idx++;break;} }}}}}return ans == -1 ? "" : s.substring(ans, ans + min_len);}
}

5.4 解题思路

  1. 标准的滑动窗口+哈希表
  2. 首先先用哈希表统计t中每种字符的长度,然后用一个标记idx用来判断窗口中包含t中的多少个元素。
  3. 右端移动,直到idx减少为0的时候移动左端,在移动前,先记录当前窗口大小,如果小于min_len,记录当前左端,并且更新min_len,移动左端,直到移动后的idx大于0.
  4. 移动窗口时,变化的是哈希表中对应存在字符的大小,如果减少到0后继续减少,idx不减少,否则idx会做相应的减少。

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

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

相关文章

教学资料档案管理系统

本系统构建 JAVA 体系的后端系统&#xff0c;围绕以安全&#xff0c;可靠&#xff0c;高速&#xff0c;健壮&#xff0c;易于扩展为目标的方向进行开发&#xff0c;在阿里等开源库的基础上实现提供教学资料档案的管理系统的后端接口的微服务架构系统。 功能包含&#xff1a;系…

蓝桥杯(B组)-每日一题(1093字符逆序)

c中函数&#xff1a; reverse(首位置&#xff0c;尾位置&#xff09; reverse(s.begin(),s.end()) 头文件&#xff1a;<algorithm> #include<iostream> #include<algorithm>//运用reverse函数的头文件 using namespace std; int main() {string s;//定义一…

每日一题——矩阵最长递增路径

矩阵最长递增路径问题 题目描述数据范围&#xff1a;进阶要求&#xff1a;示例示例 1示例 2 题解思路算法步骤&#xff1a;代码实现代码解释复杂度分析总结 题目描述 给定一个 n 行 m 列的矩阵 matrix&#xff0c;矩阵内所有数均为非负整数。你需要在矩阵中找到一条最长路径&a…

vscode 配置 Copilot 提示GHE.com连接失败

步骤一&#xff1a;打开设置并进入 settings.json 点击菜单栏中的 “文件” -> “首选项” -> “设置”。 在搜索设置栏中输入 “Copilot: Advanced”。 点击搜索结果下方的 “在 settings.json 中编辑” 链接&#xff0c;这会打开 settings.json 文件。 步骤二&#…

DEX-EE三指灵巧手:扩展AI与机器人研究的边界

DEX-EE三指灵巧手&#xff0c;由Shadow Robot与Google DeepMind合作开发&#xff0c;以其先进技术和设计&#xff0c;正在引领AI与机器人研究的新趋势。其高精度传感器和灵活的机械手指&#xff0c;能够捕捉复杂的环境数据&#xff0c;为强化学习实验提供了可靠支持。 Shadow R…

cornerstone3D学习笔记-MPR

最近在研究如何利用cornerstone3D (v1.70.13) 来实现MPR功能&#xff0c;找到它的一个demo -- volumeBasic, 运行效果如下图 看了下主程序的示例代码&#xff0c;非常简单&#xff0c;可以说corestone3D这个库把很多细节都封装起来了&#xff0c;使得调用者可以很简单的快速实…

基于YOLO11深度学习的果园苹果检测与计数系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

数据中心储能蓄电池状态监测管理系统 组成架构介绍

安科瑞刘鸿鹏 摘要 随着数据中心对供电可靠性要求的提高&#xff0c;蓄电池储能系统成为关键的后备电源。本文探讨了蓄电池监测系统在数据中心储能系统中的重要性&#xff0c;分析了ABAT系列蓄电池在线监测系统的功能、技术特点及其应用优势。通过蓄电池监测系统的实施&#…

Ubuntu 安装 OpenCV (C++)

版本详情&#xff1a; Ubuntu: 22.04 5.15.0-133-generic gcc: 11.4.0 g: 11.4.0 OpenCV: 4.7.0 1. 卸载 OpenCV 进入原先编译 opencv 的 build 目录&#xff0c;在该目录下打开终端&#xff0c;执行以下代码&#xff08;如果 build 已经删除了&#xff0c;可以重新编译一…

【AI工具之Deepseek+Kimi一键免费生成PPT】

1.打开Deepseek网页&#xff1a;DeepSeek 2.使用Deepseek获得一份PPT大纲&#xff08;输入背景需求约束条件进行提问&#xff09;如下图&#xff1a; 3.复制Deepseek输出的PPT大纲 4.打开Kimi网页&#xff1a;Kimi.ai - 会推理解析&#xff0c;能深度思考的AI助手 5.在Kimi中…

flutter在安卓模拟器上运行

目录 下载android studio&#xff0c;然后把其中的模拟器设为环境变量&#xff0c;然后在vscode/cursor中使用插件&#xff0c;打开安卓模拟器一、下载android studio网址mac 下载64位 ARM 二、启动android studio三、设置SDK四、打开文件 打开模拟器五、运行程序六、在vscode/…

POI pptx转图片

前言 ppt页面预览一直是个问题&#xff0c;office本身虽然有预览功能但是收费&#xff0c;一些开源的项目的预览又不太好用&#xff0c;例如开源的&#xff1a;kkfileview pptx转图片 1. 引入pom依赖 我这个项目比较老&#xff0c;使用版本较旧 <dependency><gro…

数仓搭建(hive):DWB层(基础数据层)

维度退化: 通过减少表的数量和提高数据的冗余来优化查询性能。 在维度退化中&#xff0c;相关的维度数据被合并到一个宽表中&#xff0c;减少了查询时需要进行的表连接操作。例如&#xff0c;在销售数据仓库中&#xff0c;客户信息、产品信息和时间信息等维度可能会被合并到一…

vue3 在element-plus表格使用render-header

在vue2中 element表格render-header 源码是有返回h()函数的 在vue3 element-plus 表格源码 render-header函数没有返回h函数了 所以需要用render-header方法中创建虚拟DOM节点的话需要引用h方法 <el-table-column header-align"right" align"right" …

前端带样式导出excel表格,html表格生成带样式的excel表格

众所周知&#xff0c;前端生成表格通常是用xlsx、excel.js等js库&#xff0c;但这些库想要生成时增加excel样式会很麻烦。 有这么一个js库把html表格连样式带数据一并导出为excel表格: html-table-to-excel npm install html-table-to-excel 使用 html表格&#xff1a; <…

ASP.NET JWT认证失败响应:从默认到自定义的优雅改造

本文主要介绍如何通过ASP.NET Core的JwtBearerEvents机制&#xff0c;实现JWT认证失败响应的深度定制。 1. 背景 在之前的文章《一个简单的ASP.NET一致性返回工具库》 中&#xff0c;我们介绍了 Sang.AspNetCore.CommonLibraries 这一通用库&#xff0c;它通过统一API响应模型…

AI工作流+专业知识库+系统API的全流程任务自动化

我有点悲观&#xff0c;甚至很沮丧&#xff0c;因为AI留给普通人的机会不多了&#xff0c;这既是人类之间权力的斗争&#xff0c;也是硅基生命和碳基生命的斗争。AI自动化是无法避免的趋势&#xff0c;如果人类不能平权&#xff0c;那就只能跪下接受审判。 通过整合AI工作流、专…

安卓burp抓包,bypass ssl pinning

好久好久没有发东西了。主要是懒。。。 这几天在搞apk渗透&#xff0c;遇到了burp无法抓包问题&#xff0c;觉得可以写下来。 问题描述 1. 一台安卓手机&#xff0c;装了面具&#xff0c;可以拿到root 2. 电脑上有burp&#xff0c;设置代理 3.手机和电脑连同一个网段&…

TS语言自定义脚手架

初始化 新建文件夹初始化命令 npm init -ytsc --initnpm i types/nodenpm i typescript# 处理别名npm i -D tsc-alias -y 表示选项都为yes 安装ts相关依赖 新建相关文件 bin 文件夹 src文件夹 commands 文件夹 &#xff08;命令 utils 文件夹 (封装方法&#xff09; index.t…

ETL工具: Kettle入门(示例从oracle到oracle的数据导入)

kettle介绍 ETL工具,用于对数据的抽取&#xff08;Extract), 转换(Transform),加载 (Load&#xff09; Kettle 是一种ETL工具, 现称为 Pentaho Data Integration (PDI) 特点:纯JAVA语言编写 官方学习文档 网站: https://docs.hitachivantara.com/r/en-us/pentaho-data-int…