LeetCode——滑动窗口

滑动窗口

包含特定元素的子串(要匹配到的目标),或最长[这个好像没啥意思]、或最短、或等长

思考:(暂时感受)

1)什么时候扩充窗口——串没走完就得扩呀;

2)窗口扩充后要更新哪些东西——窗口包括的内容,毕竟新来人了,东西多了;

3)什么时候缩小窗口——得看目标条件是啥了,最短的情况吧只要目标条件够了就得收缩,等长的情况吧等长就得缩噻;

4)窗口缩小后要更新哪些东西——窗口包括的内容;

5)什么时候更新结果——收缩的时候,还是一轮结束的时候。

1. 最小覆盖子串 76 简单

class Solution {public String minWindow(String s, String t) {// 两个Map记录目标字符以及窗口包含的字符Map<Character, Integer> need = new HashMap<>();Map<Character, Integer> window = new HashMap<>();// 填充目标字符的Mapfor (char c: t.toCharArray()) {need.put(c, need.getOrDefault(c, 0) + 1);}// 设置左右指针,区间范围是左闭右开,所以刚开始区间内没有元素int left = 0;int right = 0;int valid = 0;  // 窗口中满足需要的字符个数// 记录最小覆盖子串的起始索引和长度int start = 0;int len = Integer.MAX_VALUE;// 扩大窗口至覆盖子串while (right < s.length()) {char c = s.charAt(right);// 扩大窗口right ++;// 对窗口内的数据进行更新if (need.containsKey(c)) {window.put(c, window.getOrDefault(c, 0) + 1);if (window.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 (window.get(d).equals(need.get(d))) {valid --;}window.put(d, window.get(d) - 1);}}}return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len);}
}

2. 字符串的排列 567 中等

class Solution {public boolean checkInclusion(String s1, String s2) {// 思路:缩到最小覆盖,长度如果与s1相等,说明s1的排列之一是s2的子串// Map记录数量Map<Character, Integer> need = new HashMap<>();Map<Character, Integer> window = new HashMap<>();// 填充needfor (char c : s1.toCharArray()) {need.put(c, need.getOrDefault(c, 0) + 1);}// 滑动窗口int left = 0;int right = 0;// int start = 0;// int len = Integer.MAX_VALUE;int valid = 0;while (right < s2.length()) {char c = s2.charAt(right);// 扩大窗口right ++;if (need.containsKey(c)) {window.put(c, window.getOrDefault(c, 0) + 1);if (window.get(c).equals(need.get(c))) {valid ++;}} while (right - left >= s1.length()) {// while (valid == need.size()) {// if (right - left < len) {//     start = left;//     len = right - left;// }// 判断是否找到了合适的子串if (valid == need.size()) {return true;}char d = s2.charAt(left);left ++;if (need.containsKey(d)) {if (window.get(d).equals(need.get(d))) {valid --;}window.put(d, window.get(d) - 1);}} // if (len == s1.length()) {//     return true;// }}return false;}
}

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

class Solution {public List<Integer> findAnagrams(String s, String p) {// 存放结果List<Integer> result = new ArrayList<>();// 存放窗口元素Map<Character, Integer> need = new HashMap<>();Map<Character, Integer> window = new HashMap<>();for (char c : p.toCharArray()) {need.put(c, need.getOrDefault(c, 0) + 1);}// 滑动窗口的左右指针int left = 0;int right = 0;int valid = 0;while (right < s.length()) {char c = s.charAt(right);// 扩大窗口right ++;if (need.containsKey(c)) {window.put(c, window.getOrDefault(c, 0) + 1);if (need.get(c).equals(window.get(c))) {valid ++;}}while (right - left >= p.length()) {if (valid == need.size()) {result.add(left);// // window和valid要清空// window.clear();// valid = 0;}char d = s.charAt(left);left ++;if (need.containsKey(d)) {if (window.get(d).equals(need.get(d))) {valid --;}window.put(d, window.get(d) - 1);}}}return result;}
}

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

class Solution {public int lengthOfLongestSubstring(String s) {// 结果int result = 0;// 滑动窗口:重要的是如果map中键的值超过2,那就说明需要缩小窗口了Map<Character, Integer> window = new HashMap<>();int left = 0;int right = 0;while (right < s.length()) {char c = s.charAt(right);right ++;window.put(c, window.getOrDefault(c, 0) + 1);while (window.get(c) > 1) {char d = s.charAt(left);left ++;window.put(d, window.get(d) - 1);}// 更新答案result = Math.max(result, right - left);}return result;}
}

【未完待续……】

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

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

相关文章

2024年Java JDK下载安装教程,附详细图文

文章目录 简介一、JDK的下载二、JDK的安装三、设置环境变量(不一定需要执行&#xff09; 简介 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f34…

4D Solver

好的,我将详细解释一下4D Solver是如何将视频、深度数据与MetaHuman人物表情网格数据相结合的: 4D Solver实际上是一种先进的计算机视觉算法,它能将2D视频图像数据与3D几何网格数据相匹配和对齐。 具体过程分为以下几个步骤: 标定(Calibration) 首先需要对捕捉设备(iPhone或…

Golang操作Redis

一. Redis介绍 1.1 简介 Redis是完全开源免费的&#xff0c;遵循BSD协议&#xff0c;是一个高性能的key-value数据库。 Redis与其它的key-value缓存产品有以下三个特点&#xff1a; Redis支持数据持久化&#xff0c;可以见内存中的数据报错在磁盘中&#xff0c;重启的时候可以…

python hashlib模块介绍

hashlib是Python标准库中的一个模块,用于提供常见哈希函数的接口。它可以用来计算数据的哈希值,包括MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512等算法。 下面是hashlib模块的一些常见方法和特点: 哈希对象的创建:使用hashlib模块的相应函数创建哈希对象,例如md5()、…

助力实现更可持续未来的智能解决方案:AI如何改变世界

人工智能已然成为今年的热门话题。由于生成式AI应用的快速采用&#xff0c;新闻头条充斥着有关AI如何彻底改变我们的政策制定、就业和经济走向的预测。您知道AI也是我们应对各种可持续发展挑战的先锋吗&#xff1f;AI通过分析大量数据&#xff0c;并提供有用的见解和工具&#…

【Unity动画系统】Animator组件的属性

介绍Animator组件的全部属性 Controller&#xff1a;动画控制器 Avatar&#xff1a;人物骨骼 Apply Root Motion&#xff1a;有一些动画片段自带位移&#xff0c;如果希望自带的位移应用在游戏对象上&#xff0c;那么就勾选&#xff1b;如果自己编写脚本&#xff0c;那么就不…

Swift 中如何四舍五入

在 Swift 中&#xff0c;你可以使用不同的方法来进行四舍五入操作&#xff0c;具体取决于你的需求和场景。以下是几种常见的方法&#xff1a; round()函数 round()函数可以对浮点数进行四舍五入&#xff0c;并返回最接近的整数。 let number 3.75let roundedNumber round(n…

深度学习和强化学习的区别

深度学习和强化学习是机器学习领域中两个非常重要的研究方向&#xff0c;它们有着不同的应用、原理和目标。虽然这两者可以结合使用&#xff08;例如在深度强化学习中&#xff09;&#xff0c;但它们的基本概念和方法有着根本的区别。 深度学习&#xff08;Deep Learning&…

【静态分析】静态分析笔记08 - 指针分析 - 上下文敏感

参考&#xff1a; 【课程笔记】南大软件分析课程8——指针分析-上下文敏感&#xff08;课时11/12&#xff09; - 简书 ------------------------------------------------------------------------------------------------------------- 1. 上下文不敏感的问题 说明&#…

C# 图像处理 添加水印

方法1&#xff0c;使用自带的画刷进行绘制水印 示例代码 public partial class Form1 : Form{public Form1(){InitializeComponent();}string photoPathstring.Empty;Bitmap image null;private void button1_Click(object sender, EventArgs e) //选择照片{OpenFileDialog d…

SQL中PIVOT函数的用法

文章目录 前言1. SQL Server2. MySQL3. Oracle 前言 PIVOT 是 SQL Server 中的一个功能&#xff0c;用于将行转换为列。然而&#xff0c;MySQL 和 Oracle 不直接支持 PIVOT 语法。但是&#xff0c;你可以使用条件聚合或其他技术来模拟 PIVOT 的行为。 语法&#xff1a; -- 从子…

设计模式:开放-封闭原则(Open-Closed Principle,OCP)介绍

开放-封闭原则&#xff08;Open-Closed Principle&#xff0c;OCP&#xff09;是面向对象设计原则之一&#xff0c;它指导我们编写可扩展和易维护的代码。该原则的核心思想是&#xff1a; 软件实体&#xff08;类、模块、函数等&#xff09;应该对扩展开放&#xff0c;对修改封…

Anagrams

描述 Most crossword puzzle&#xff08;猜字谜&#xff09; fans are used to anagrams&#xff08;字谜&#xff09;--groups of words with the same letters in different orders--for example OPTS, SPOT, STOP, POTS and POST. Some words however do not have this att…

【C++】位图

文章目录 1. 位图概念2. 位图的实现3. 位图的应用 1. 位图概念 面试题 给 40 亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这 40 亿个数中。 遍历&#xff0c;时间复杂度 O(N) 排序 O(NlogN)&#xff0c;利用二分查找&…

全志ARM-官方库SDK安装和验证

进入界面&#xff0c;输入以下指令 git clone https://github.com/orangepi-xunlong/wiringOP //下载源码 cd wiringOP //进入文件夹 sudo ./build clean //清除编译信息 sudo ./build …

leetCode58. 最后一个单词的长度

leetCode58. 最后一个单词的长度 思路&#xff1a;从末端使用双指针算法 代码 /* 我们采用双指针算法: 从后往前找&#xff0c;第一个指针是最后一个不是空格的字符 第二个指针指向的是前面空格的后一个字符 长度即为 i - j */ class Solution { public:int lengthOfLastWord(…

C++ | Leetcode C++题解之第40题组合总和II

题目&#xff1a; 题解&#xff1a; class Solution { private:vector<pair<int, int>> freq;vector<vector<int>> ans;vector<int> sequence;public:void dfs(int pos, int rest) {if (rest 0) {ans.push_back(sequence);return;}if (pos fr…

前端JS必用工具【js-tool-big-box】,防抖和节流的方法调用学习

这一小节&#xff0c;我们针对前端工具包&#xff08;npm&#xff09;js-tool-big-box的使用做一些讲解&#xff0c;主要是防抖和节流方面的。 目录 前言 1 安装和引入 2 防抖的调用学习 3 节流的调用学习 4 使用方法总结 前言 在前端项目中&#xff0c;经常涉及到防抖…

使用Redis实现延时队列

redis的zset实现延迟队列 延迟队列是什么&#xff1f; 延时队列相比于普通队列最大的区别就体现在其延时的属性上&#xff0c;普通队列的元素是先进先出&#xff0c;按入队顺序进行处理&#xff0c;而延时队列中的元素在入队时会指定一个延迟时间&#xff0c;表示其希望能够在经…

多数据源注解使用

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> </dependency> 1.使用mybatis-plus 如何配置多数据源&#xff0c;application-loc…