算法通关村——滑动窗口高频问题

滑动窗口之最长子串

无重复字符的最长子串

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

示例:

输入:s = “abcabcbb”

输出:3

解释:因为无重复字符的最长子串是"abc",所以其长度为3.

要找最长子串,必然要知道无重复字符串的首和尾,然后再从中确定最长的那个,因此至少两个指针才可以,这就想到了滑动窗口思想。这里介绍一种经典的使用Map的思路。

定义一个K-V形式的map,key表示的是当前正在访问的字符串,vaule是其下标索引值。我们每访问一个新元素,都将其下标更新成对应的索引值。具体过程如下图:

image-20231211102005407

如果是已经出现过的,例如上述示例中的abcabc,当第二次遇到a时,我们就更新left成为第一个b所在的位置,此时可以发现left要移动的位置恰好就是map.get(‘a’) + 1 = 1,将’a’用序列表示,放在一起就是map.get(s.charAt(i)) + 1。其他情况参考图示以此类推。

这里需要考虑一种特殊情况,例如abba,第二次访问b时,更新left,left=map.get(‘b’) + 1 =2

然后继续访问第二个a,此时left=map.get(‘a’)+1=1,也就是left后退了,显然不对。

应该让left在2的基础上继续向前,我们可以和原来的对比一下,将最大的加1就可以了,也就是left=Math.max(left, map.get(s.charAt(i))+1)

完整代码如下:

public int lengthOfLongestSubstring(String s) {
    if (s.length() == 0) return 0;
    HashMap<Character, Integer> map = new HashMap<Character, Integer>();
    int max = 0;
    int left = 0;
    for (int right = 0; right < s.length(); right++) {
        if (map.containsKey(s.charAt(right))) {
            left = Math.max(left, map.get(s.chatAt(right)) + 1);
        }
        map.put(s.charAt(right), right);
        max = Math.max(max, right - left + 1);
    }
    return max;
}

至多包含两个不同字符的最长子串

LeetCode159. 给定一个字符串,找出至多包含两个不同字符的最长子串t,并返回该子串的长度。

示例:

输入:“eceba”

输出:3

解释:t 是"ece",长度为3.

我们仍然使用left和right来锁定一个窗口,然后一边向右移动一边分析。我们用aabbcccd这个序列来看

image-20231211161824078

对于这个题,有两个问题需要解决,一个是怎么判断只有2个元素,另一个是移除的时候怎么知道移除谁,以及移除之后left是什么。

要判断只有2个元素,还是Hash好用,每一个时刻,这个Hashmap包括不超过3个元素。

这里还要考虑到要移除谁,所以我们要设计一下Hash的K-V含义。我们把字符串里的字符都当作键,在窗口中的最右边的字符位置作为值。此时使用下面的代码可以确定删除谁,以及窗口left的新位置:

del_idx = Collections,min(hashmap.values());
left = del_idx + 1;

image-20231211162305711

完整代码如下:

public int lengthOfLongestSubstringTwoDistinct(String s) {
    if(s.length() < 3) {
        return s.length();
    }
    int left = 0, right = 0;
    HashMap<Character, Integer> hashmap = new HashMap<>();
    int maxLen = 2;
    
    while (right < s.length()) {
        if (hashmap.size() < 3) {
            hashmap.put(s.charAt(right), right + 1);
        }
        
        //如果大小达到了3
        if (hashmap.size() == 3) {
            //最左侧要删除的位置
            int delIndex = Collection.min(hashmap.values());
            hashmap.remove(s.charAt(delIndex));
            //窗口left的新位置
            left = delIndex + 1;
        }
        
        maxLen = Math.max(maxLen, right - left);
    }
    return maxLen;
}

如果是至多包含k个不同字符的最长子串,只用将判断hash大小为2改成k就可以了,超过2就是k+1即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Socket介绍及使用Java实现socket通信前后端示例代码

本文介绍一下再Java中Socket的实现。 目录 一、需要掌握 二、程序源码 三、运行演示 一、介绍 Java Socket实现实时接收TCP消息需要客户端和服务端两个部分。 二、JavaSocket源码示例 客户端后台部分代码 public class Client {public static void main(String[] args)…

【亚马逊云科技】使用Vscode - Q完成GUI界面粉笔脚本开发

前言 亚马逊云科技-Q&#xff0c;可以快速获得紧迫问题的相关答案&#xff0c;解决问题&#xff0c;生成内容。当与Q 聊天时&#xff0c;它会提供即时的相关信息和建议&#xff0c;以帮助简化任务、加快决策速度&#xff0c;并帮助激发工作中的创造力和创新。本次我们通过完整…

初始集合框架+时间和空间复杂度(数据结构)

【本节目标】 1. 什么是集合框架 2. 集合框架的重要性 3. 背后所涉及的数据结构 【本节目标】 1. 算法效率 2. 时间复杂度 3. 空间复杂度 1. 什么是集合框架 Java 集合框架 Java Collection Framework &#xff0c;又被称为容器 container &#xff0c;是定义在 java.util 包…

京东数据分析(京东大数据运营):10月取暖器行业迎来消费热潮,销额环比增长约570%!

随着气温降低&#xff0c;御寒用品开始热销。 气温的下降对取暖器的销售有明显的拉动效果&#xff0c;环比来看&#xff0c;10月份取暖器的销量销额均呈现三位数增长。鲸参谋数据显示&#xff0c;今年10月&#xff0c;京东平台取暖器的销量将近28万&#xff0c;环比增长572%&am…

Nacos配置管理-配置热更新

目录 一、Nacos配置管理回顾 1.1 统一配置管理 1.1.1 在nacos中添加配置文件 1.1.2 在弹出的表单中&#xff0c;填写配置信息 1.1.3 从微服务拉取配置 1.1.4 在项目中新增一个配置文件bootstrap.yaml&#xff0c;内容如下&#xff1a; 1.1.5 读取nacos配置 1.1.6 效果 二…

【算法题】数字字符串组合倒序 (js)

解法&#xff1a; const str "I am an 20-years out--standing * -stu- dent";function solution(str) {const arr str.split(" ");const newArr arr.map((str) > {if (/[a-zA-Z0-9-]/.test(str)) {if (/-{2}/g.test(str)) {return str.replace(/-…

vue安装与配置

node node.js的下载&#xff1a;https://nodejs.org/dist 在项目中可能会有版本冲突&#xff0c;这里可以选择自己想要的版本下载&#xff0c;而且一台电脑可以同时安装多个版本的node。当你需要切换版本时直接去更改环境变量即可。下面我安装选择的是压缩包&#xff0c;压缩包…

SDXL使用animateDiff和hotshot-xl进行文生视频

截至2023.12.8号&#xff0c;目前市面上有两款适用于SDXL的文生视频开源工具&#xff0c;分别是AnimateDiff和hotshot-xl。 一、工具下载链接 &#xff08;1&#xff09;AnimateDiff的webui版本的git链接&#xff1a; GitHub - continue-revolution/sd-webui-animatediff: A…

vue中el-upload结合vuedraggable实现图片的上传、排序、删除以及预览等功能

实现效果&#xff1a; 功能实现&#xff1a; 要实现图片的拖拽功能首先需要安装vuedraggable库 npm install vuedraggable --save在组件中引入并注册 vuedraggable <script>import draggable from "vuedraggable";export default {// 注册组件components: {…

【神行百里】pandas查询加速之行索引篇

最近进行大数据处理的时候&#xff0c;发现我以前常用的pandas查询方法太慢了&#xff0c;太慢了&#xff0c;真是太慢了&#xff0c;查阅资料&#xff0c;遂发现了一种新的加速方法&#xff0c;能助力我飞上天&#xff0c;和太阳肩并肩&#xff0c;所以记录下来。 1. 场景说明…

ThingWorx/Vuforia—工业物联网和AR平台

产品概述 ThingWorx是美国PTC公司旗下的一款物联网和AR平台&#xff0c;它提供了适用于IoT的开发工具和能力&#xff0c;使开发者可以为工业物联网快速构建和部署变革性的智能互联解决方案&#xff0c;使创新者能够快速为当今的智能互联世界提供优异的应用程序、解决方案和用户…

mmyolo的bbox_loss和检测bbox都是空

最近用mmyolo训练自己的数据集的时候发现训练的时候loss_bbox0&#xff0c;测试和eval的时候结果也全是空的&#xff0c;排除了数据集读取的问题&#xff0c;最后发现是config中自定义了自己的类别但是没有传给dataset。。。 简而言之&#xff0c;在自定义了数据集里的metainf…

常见表单元素的使用

目录 **表单是什么**一, from&#x1f367; Action 属性&#x1f367; Method 属性 二,input&#x1f367; 常见的type属性&#x1f367;text属性 三,select,option下拉框&#x1f367;selected属性 四,textarea五, button 表单是什么 HTML 表单用于收集用户的输入信息。 表示文…

2,PyCharm的下载与安装

1&#xff0c;PyCharm的下载 a&#xff1a;打开PyCharm官网&#xff0c;并选择Developer Tools → PyCharm Pycharm官网地址 b&#xff1a;点击Download c&#xff1a;下载完成后&#xff0c;会在下载文件夹中&#xff0c;出现“pycharm-professional-2023.3.exe”文件 2&a…

C++类与对象(一)

目录 一&#xff0c;面向过程和面向对象初步认识 二&#xff0c;类的引入 三&#xff0c;类的定义 四&#xff0c;类的访问限定符及封装 五&#xff0c;类的实例化 六&#xff0c;类对象模型 七&#xff0c;this指针 一&#xff0c;面向过程和面向对象初步认识 c语言是面…

菜鸟学习日记(python)——循环语句

python中的循环语句包括for循环语句和while循环语句&#xff0c;但是python中是没有do...while循环语句的。 while循环语句 while循环语句的一般格式为; while condition:loop body condition是循环判断条件&#xff0c;loop body是循环体。 当循环条件成立时&#xff0c;…

APP广告变现有哪些独特的优势?

作为互联网广告的载体&#xff0c;APP天生就比线下传统广告位更具优势&#xff0c;不受地域限制可以辐射到地球上的每一个角落&#xff0c;可以让广告获得更广的覆盖面。通过丰富的广告形式&#xff0c;精准的目标用户画像&#xff0c;也可以更好地实现品牌广告或效果广告的投放…

day45-46-Vue+ElementUI实现学生管理

VueElementUI实现学生管理 代码&#xff1a; qiushiju/java2313_vue_elementui_crud (gitee.com) 一、思考 考虑需求&#xff08;登录&#xff0c;查询全部&#xff0c;基本增删改查&#xff0c;分页&#xff0c;搜索&#xff0c;批量&#xff09; 设计数据库搭建项目 后端…

数据结构期末考前复习

时间复杂度分析 常数时间复杂度 O(1) 的示例&#xff1a; def print_first_element(arr):print(arr[0])# 无论 arr 的大小如何&#xff0c;执行时间都是恒定的&#xff0c;因此具有常数时间复杂度。线性时间复杂度 O(n) 的示例&#xff1a; def print_all_elements(arr):for …

【并发编程篇】Callable实现多线程计算

文章目录 &#x1f354;简述Callable&#x1f33a;代码测试⭐如果改为了两个线程&#xff0c;效果如何 &#x1f354;简述Callable Callable是Java中一个函数式接口&#xff0c;用于表示可以返回结果并且可能会抛出异常的计算任务。该接口定义了一个call()方法&#xff0c;该方…