三、滑动窗口问题

3、无重复字符的最长子串(中等)

题目描述

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

示例 1:

输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:

输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:

输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

提示:

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

题目思路

对于这道题,要求是找到最长连续的、不包含重复字符的字符子串。

经过观察思考我们可以得知,可以通过滑动窗口的方法来寻找这样的答案。

这里,子串的条件是不能包含重复的字符,因此首先在遍历时,我们可以定义一个哈希表来保存对应字符所处位置,方便查看当前字符是否在子串中。

同时,定义leftright指针,分别作为滑动窗口的左右两端,因此子串长度就是right - left

right从左到右遍历时,对于s[right]

  • 如果该字符未曾出现、或出现的位置在当前子串左边,那么该字符可以作为
  • 否则,就对left指针进行更新——即更新到对应已重复字符的下一个位置,将重复排除掉;
  • 最后,每轮循环都需要记录或刷新当前字符的位置;

算法代码

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:letter_index_map = {}left, right = 0, 0max_length = 0while right < len(s):curr_letter_index = letter_index_map.get(s[right])# 说明当前字符要么从未出现、要么在当前子序列之前出现if curr_letter_index is None or curr_letter_index < left:max_length = max(max_length, right - left + 1)else:left = curr_letter_index + 1# 记录/刷新当前字符所在位置letter_index_map[s[right]] = rightright += 1return max_length

438、找到字符串中所有字母异位词(中等)

题目描述

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

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

输入: s = “cbaebabacd”, p = “abc”
输出: [0,6]
解释:
起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。
起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词。

示例 2:

输入: s = “abab”, p = “ab”
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 “ab”, 它是 “ab” 的异位词。
起始索引等于 1 的子串是 “ba”, 它是 “ab” 的异位词。
起始索引等于 2 的子串是 “ab”, 它是 “ab” 的异位词。

提示:

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

题目思路

所谓的异位词,在哈希问题中已有说明: 49、字母异位词分组
在该问题中,既可以直接对单词进行排序来判断。

在这道题中,这里如果直接去排序的话,需要排序的次数就太多了,例如如果s长度是10,p长度是3,那么至少要排序7+1次,更不用说s和p的长度可能会非常大。

因此,另一种方法则是字母计数,只需要使用ASCII码作为索引构造哈希表,然后统计字母出现次数,最后对比两个哈希表是否相同,就可以知道两个单词是否是字母异位词了。

在这道题中,本质上就是以p的长度划定一个滑动窗口,每向右移动一位时:

  • 窗口最左侧字符去掉,因此该字符的计数-1;
  • 窗口最右侧字符新增,因此该字符的计数+1;
  • 如果此时的s_counterp_counter是否相同,就将对应索引加入结果中;

需要注意的是,在滑动前,我们自然是要有已经构造好的窗口,因此定义两个字母哈希表s_counterp_counter

  • s_counter,记录滑动过程中,s字符子串字符出现次数;
  • p_counter,不变量,记录p的字符出现次数,相当于模板;

同时,因为所谓遍历,本质上就是开始滑动窗口,因此构造完s_counterp_counter后,需要首先做一下判断,看下第一个滑动区间是否满足条件。

算法代码

class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:s_len, p_len = len(s), len(p)if s_len < p_len:return []s_counter = [0] * 26p_counter = [0] * 26total_anagrams_idx = []for i in range(p_len):s_counter[ord(s[i]) - ord('a')] += 1p_counter[ord(p[i]) - ord('a')] += 1# 第一个滑动区间单独判断if s_counter == p_counter:total_anagrams_idx.append(0)for i in range(s_len - p_len):# 滑动一位,去掉左侧字符,新增右侧字符s_counter[ord(s[i]) - ord('a')] -= 1s_counter[ord(s[i + p_len]) - ord('a')] += 1if s_counter == p_counter:total_anagrams_idx.append(i + 1)return total_anagrams_idx

补充说明

所谓滑动窗口法,又称为“寸取法”,一般用来解决查找满足依一定条件的连续区间的特殊性质(长度等) 等一类问题

由于区间是连续的,因此当整个区间发生变化时,可以通过对旧有的计算结果对搜索空间的剪枝(一般就是滑动窗口最左侧滑出的部分),从而减少了重复计算、降低了时间复杂度、避免了暴力的搜索。

往往类似于“请找到满足xx条件的最x区间/子串/子数组”这一类问题都可以使用滑动窗口法来进行解决。

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

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

相关文章

代码随想录day26--贪心基础

什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优 举个例子&#xff1a; 有一堆钞票&#xff0c;可以拿走十张&#xff0c;如果想要达到最大的金额&#xff0c;应该怎么拿&#xff1f; 指定每次拿最大的&#xff0c;最终结果就是拿走最大数额的…

计算机视觉发展的方向和潜在机会

计算机视觉发展的方向 文章目录 计算机视觉发展的方向计算机视觉发展的方向潜在机会 计算机视觉发展的方向 未来计算机视觉发展的方向可能包括以下几个方面&#xff1a; 深度学习和神经网络&#xff1a;深度学习已经成为计算机视觉领域的重要技术&#xff0c;未来将继续深入研…

MySQL安装、配置与卸载教程(Windows版)

MySQL是一个关系型数据库管理系统&#xff0c;目前为Oracle旗下产品&#xff0c;它具有开源、体积小、速度快的优点&#xff0c;许多网站使用的都是MySQL数据库。 简单而言&#xff0c;MySQL数据库核心功能就是用来存储数据的。 MySQL数据库分为社区版和商业版&#xff0c;这…

idea将文件加入到SVN

文件右键Subversion->Add to Vcs Settings->Version Control->Confirmation 勾上Add silently ,每次自动添加就不用一个个加了

计算机视觉学习指南(划分为20个大类)

计算机视觉的知识领域广泛而庞杂&#xff0c;涵盖了众多重要的方向和技术。为了更好地组织这些知识&#xff0c;我们需要遵循无交叉无重复&#xff08;Mutually Exclusive Collectively Exhaustive&#xff0c;MECE&#xff09;的原则&#xff0c;并采用循序渐进的方式进行分类…

ajax 如何从服务器上获取数据?

在Web开发中&#xff0c;AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种常用的技术&#xff0c;用于在不重新加载整个页面的情况下&#xff0c;从服务器获取数据并更新网页的某一部分。使用AJAX&#xff0c;你可以创建异步请求&#xff0c;从而提供更快的…

文件上传漏洞--Upload-labs--Pass02--Content-Type绕过

一、什么是 Content-Type 我们在上传文件时利用 Burpsuite 进行抓包&#xff0c;如下图所示&#xff1a; 上传文件后台的源代码可能会对 Content-Type 进行规定&#xff0c;设置白名单 或 黑名单&#xff0c;这时就要利用Content-Type绕过上传含有恶意代码的 php文件。 二、代…

lscpu命令详解

文章目录 前言lscpu 命令详解命令1\. 查看物理 CPU 个数2\. 查看每个物理 CPU 核数3\. 查看总线程数4\. 查看内存信息5\. 查看 linux 系统版本 前言 Linux 系统查看系统相关信息方法很多&#xff0c;以下详细介绍 lscpu 命令&#xff0c;以及其它相关命令。 lscpu 命令详解 …

大白话说说Docker容器默认网络模型工作原理

Docker的默认网络模型 —— 桥接模式&#xff08;Bridge&#xff09; 当你不做任何特殊设置时&#xff0c;Docker会使用一种叫做“桥接模式”的网络设置。这就像是给你的容器小房子安装了一个虚拟的桥接网络。这座桥连接着容器和你的电脑&#xff08;宿主机&#xff09;&#…

Spring Boot项目中TaskDecorator的应用实践

一、前言 TaskDecorator是一个执行回调方法的装饰器&#xff0c;主要应用于传递上下文&#xff0c;或者提供任务的监控/统计信息&#xff0c;可以用于处理子线程与主线程间数据传递的问题。 二、开发示例 1.自定义TaskDecorator import org.springframework.core.task.Task…

js filter,every,includes 过滤数组

背景&#xff1a; 页面&#xff1a;在项目中遇到的&#xff0c;前端页面显示为&#xff0c;顶部是下拉搜索条件,下面是一个表格&#xff1b; 数据&#xff1a;接口请求一次性拿到所有&#xff1a;搜索条件里的下拉选项和表格中的数据&#xff1b; 现状&#xff1a;需要前端在搜…

摄像设备+nginx+rtmp服务器

前言 由于html中的video现在不支持rtmp协议(需要重写播放器框架&#xff0c;flash被一刀切&#xff0c;360浏览器还在支持flash),遂用rtmp作为桥梁,实际是hls协议在html中起作用. 在此推荐一款前端播放器,.ckplayer 简直了,写点页面,一直循环&#xff0c;洗脑神曲 dream it po…

【rust】7、命令行程序实战:std::env、clap 库命令行解析、anyhow 错误库、indicatif 进度条库

文章目录 一、解析命令行参数1.1 简单参数1.2 数据类型解析-手动解析1.3 用 clap 库解析1.4 收尾 二、实现 grep 命令行2.1 读取文件&#xff0c;过滤关键字2.2 错误处理2.2.1 Result 类型2.2.2 UNwraping2.2.3 不需要 panic2.2.4 ? 问号符号2.2.5 提供错误上下文-自定义 Cust…

山海鲸可视化软件:多场景下的数据呈现利器

在当今数据驱动的时代&#xff0c;数据可视化成为了企业和个人不可或缺的工具。作为一个老数据人&#xff0c;本文想借用自己常用山海鲸可视化软件&#xff0c;带大家了解在不同使用场景下数据可视化的应用。山海鲸可视化是一款可以免费编辑、本地化部署的产品&#xff0c;对数…

小程序域名可以使用免费的SSL证书吗?

对于小程序域名而言&#xff0c;选择何种类型的SSL证书主要取决于小程序域名的具体情况。如果小程序域名是单独的域名&#xff0c;那么可以选择最为常见的免费单域名证书&#xff1b;如果小程序是公司主域名的子域名&#xff0c;则可以选择免费的通配符证书&#xff0c;一张证书…

facebook群控如何做?静态住宅ip代理在多账号运营重的作用

在进行Facebook群控时&#xff0c;ip地址的管理是非常重要的&#xff0c;因为Facebook通常会检测ip地址的使用情况&#xff0c;如果发现有异常的使用行为&#xff0c;比如从同一个ip地址频繁进行登录、发布内容或者在短时间内进行大量的活动等等&#xff0c;就会视为垃圾邮件或…

代码随想录算法训练营Day36 | 435.无重叠区间、763.划分字母区间、56.合并区间

435.无重叠区间 这题需要判断好两个点&#xff1a; 1、什么时候移除元素&#xff1f;&#xff08;如何判断重叠&#xff1f;&#xff09;——当前区间左边界小于之前区间右边界时移除元素 2、移除哪个元素&#xff1f;——移除右边界更靠后的元素 整体解题框架和昨天打气球…

PHP如何实现动态代理IP

在网络爬虫、数据挖掘、网络安全等领域&#xff0c;动态代理IP的应用越来越广泛。动态代理IP可以帮助我们突破访问限制&#xff0c;保护真实IP地址&#xff0c;防止被封禁。 PHP是一种广泛应用于Web开发的流行服务器端脚本语言。那么&#xff0c;如何在PHP中实现动态代理IP呢&…

【架构】GPU虚拟化

GPU虚拟化方法 远程调用API 半虚拟化和全虚拟化 硬件划分 局限&#xff1a;授权付费 Hardware Partition&#xff1a;Ampere 架构的 A100 GPU 所支持的 MIG&#xff0c;即是一种 Hardware Partition。它的问题是不灵活: 只有高端 GPU 支持&#xff1b;只支持 CUDA 计算&#x…

基于springboot校园志愿者管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;校园志愿者管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;…