LeetCode HOT 100:3. 无重复字符的最长字串

1. 链接

. - 力扣(LeetCode)

2. 题目描述

3. 题解

方法一:滑动窗口 + 哈希表

根据题意:

1. 遍历所有可能的子串——利用滑动窗口表示子串;

2. 保证滑动窗口内不包含重复字符——需要哈希表map记录字符出现的下标。

问题:

1. 如何保证每个子串的考虑过了?

2. 如何保证既无重复又是最长?

思路:

1. 设置代表滑动窗口边界的两个指针left、i;

2. 在for循环中,每次都判断以i为右边界的子串(滑动窗口)的最长无重复情况,这就保证了算无遗漏。

3. 每次考虑一个新的右边界i,都要判断滑动窗口内是否包含与右边界相同的字符。左指针left的位置,就是为了保证滑动窗口既无重复又是最长。

4. 根据map中的记录,找到上一个与i字符相同的位置(这里要注意,因为是顺序遍历i,所以在考虑i时,i之前的字符都已经被考虑过了)。如果left不在该字符右侧,说明新加入的i字符已经存在于滑动窗口中,为了保证无重复,left就是该位置的右一位;如果left已经在该位置的右侧,说明虽然之前有和i字符相同的,但是现在已经在滑动窗口之外,不予考虑,left保持不变。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int max = 0;
        int left = 0;  // 1逻辑
        Map<Character, Integer> map = new HashMap<>();
        char[] ch = s.toCharArray();
        for (int i = 0; i < s.length(); i++) {
            if (map.containsKey(ch[i])) {
                int newl = map.get(ch[i]);
                left = Math.max(left, newl + 1); // 3,4逻辑
            }
            map.put(ch[i], i); // 2逻辑
            max = Math.max(max, i - left + 1);
        }
        return max;
    }
}

方法二:动态规划 + 哈希表

问题:

1. 以i为结尾的子串表示每次的状态,那么前后两次状态是否有联系?

思路:

1. 同方法一的2;

2. 遍历每个字符,左边界left:找到该字符前一次出现的地方 + 1,如果没有就为0;

3. 以i-1字符为结尾的最长无重复子串的长度tmp与i - left + 1(当前字符与上一个重复字符之间的长度)的关系:如果tmp >= i - left + 1,说明以i-1字符为结尾的无重复最长子串中包含了i字符的重复字符,又因为tmp表示的是i-1无重复,所以tmp可以无痛(隐含的left指针就是i字符前一次出现的地方+1)更新为i - left + 1;如果tmp < i - left + 1,说明以i-1字符为结尾子串一定包含在当前left和i之间,所以为了保证最长无重复,以i-1字符为结尾子串直接链接i字符,即 tmp = tmp + 1。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character, Integer> dic = new HashMap<>();
        int res = 0, tmp = 0, len = s.length();
        for(int j = 0; j < len; j++) { //i表示左边界,j表示右边界
            int i = dic.getOrDefault(s.charAt(j), -1) + 1;  //逻辑2
            dic.put(s.charAt(j), j);
            tmp = tmp < j - i + 1 ? tmp + 1 : j - i + 1;  //逻辑3
            res = Math.max(res, tmp);
        }
        return res;
    }
}

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

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

相关文章

PostgreSQL基本使用Schema

参考文章&#xff1a;PostgreSQL基本使用&#xff08;3&#xff09;Schema_pg数据库查询schema-CSDN博客 PostgreSQL 模式&#xff08;Schema&#xff09;可以理解为是一个表的集合&#xff08;或者所属者&#xff09;。 例如&#xff1a;在 MySQL 中&#xff0c;Scheam 是库&…

etcd集群部署

1.etcd介绍 1.1 什么是etcd etcd的官方定义如下: A distributed, reliable key-value store for the most critical data of distributed systemetcd是一个Go语言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值(key value)存储、配置共享和服务发现等…

Nginx-狂神说

Nginx概述 公司产品出现瓶颈&#xff1f; 我们公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应用就够了&#xff0c;然后内部tomcat返回内容给用户。 但是慢慢的&#xff0c;使用我们平台…

C++ 常用UI库

AWTK github gitee doc scons 类似RT-Thread element github C Cross platfrom C GUI libraries&#xff0c;QT可替代方案。调试包 SDL GUI cegui 创作不易&#xff0c; 小小的支持一下吧&#xff01;

如何在Windows 10上对硬盘进行碎片整理?这里提供步骤

随着时间的推移&#xff0c;由于文件系统中的碎片&#xff0c;硬盘驱动器可能会开始以较低的效率运行。为了加快驱动器的速度&#xff0c;你可以使用内置工具在Windows 10中对其进行碎片整理和优化。方法如下。 什么是碎片整理 随着时间的推移&#xff0c;组成文件的数据块&a…

YOLOv10详细解读 | 一文带你深入了解yolov10的创新点(附网络结构图 + 举例说明)

前言 Hello大家好&#xff0c;我是Snu77&#xff0c;继YOLOv9发布时间没有多久&#xff0c;YOLOv10就紧接着发布于2024.5.23号&#xff08;不得不感叹YOLO系列的发展速度&#xff0c;但要纠正大家的观点就是不是最新的就一定最好&#xff09;&#xff01; 本文给大家带来的是…

Unity开发——XLua热更新之Hotfix配置(包含xlua获取与导入)

一、Git上获取xlua 最新的xlua包&#xff0c;下载地址链接&#xff1a;https://github.com/Tencent/xLua 二、Unity添加xlua 解压xlua压缩包后&#xff0c;将xlua里的Assets里的文件直接复制进Unity的Assets文件夹下。 成功导入后&#xff0c;unity工具栏会出现xlua选项。 …

vue3瀑布流示例,左侧菜单根据窗口滚动条进行固定和取消固定,实现瀑布流demo

瀑布流demo的实现效果&#xff1a; 效果说明&#xff1a; 1.使用vue3实现瀑布流效果&#xff1b; 2.瀑布流横向设置5等分&#xff0c;可根据个人需求调整&#xff1b; 3.左侧菜单可根据右侧滚动条滑动时进行固定和取消固定&#xff0c;实现更优的展示效果&#xff1b; 4.瀑…

Django 里html模板

Django 提供两种方式让程序员自定义html模板。 第一种方法 在项目文件夹里的urls.py进行添加 修改代码如下 from django.contrib import admin from django.urls import path from app01 import views # 得添加这行urlpatterns [path(xxx/, views.home), # 添加这行path(…

从0开始学统计-你能区分率和构成比吗?

1.数据的变异度如何描述&#xff1f; 数据的变异度描述了数据集中数值之间的差异或波动程度。常用的描述数据变异度的统计量包括&#xff1a; &#xff08;1&#xff09;范围&#xff08;Range&#xff09;&#xff1a;范围是数据集中最大值与最小值之间的差异&#xff0c;表…

NDIS小端口驱动(九)

PCIe设备难免会遇到一些重置设备的请求&#xff0c;例如重置总线的时候&#xff0c;但是由于NIC网卡的多样性&#xff0c;重置设备确实也有许多要注意的地方&#xff0c;另外还有一些包含WDM的NDIS驱动 微型端口驱动程序硬件重置 微型端口驱动程序必须向 NdisMRegisterMinipo…

重新思考:Netflix 的边缘负载均衡

声明 本文是对Netflix 博客的翻译 前言 ​ 在先前关于Zuul 2开源的文章中&#xff0c;我们简要概述了近期在负载均衡方面的一些工作。在这篇文章中&#xff0c;我们将更详细地介绍这项工作的原因、方法和结果。 ​ 因此&#xff0c;我们开始从Zuul和其他团队那里学习&#…

L01_JVM 高频知识图谱

这些知识点你都掌握了吗&#xff1f;大家可以对着问题看下自己掌握程度如何&#xff1f;对于没掌握的知识点&#xff0c;大家自行网上搜索&#xff0c;都会有对应答案&#xff0c;本文不做知识点详细说明&#xff0c;只做简要文字或图示引导。 类的生命周期 类加载器 JVM 的内存…

CAD二次开发(2)-将直线对象添加到CAD图形文件

1. 准备工作 创建一个类库项目&#xff0c;如下&#xff1a; 2. 分析Line对象 Line类的初始化方法和参数 using Autodesk.AutoCAD.DatabaseServices; Line line new Line();Line 继承Curve 继承Entity 继承DBObject 继承Drawable 继承RXObject 初始化方法有两个&#xf…

2024年汉字小达人活动4个多月开赛:18道历年选择题和答案、解析

根据近年的安排&#xff0c;2024年第11届汉字小达人比赛还有4个多月就启动&#xff0c;那么孩子们如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。②把历年真题刷…

求两个整数最大公约数的方法

可以使用递归来实现&#xff0c;编写gcd函数返回最终的结果(最大公约数)。传入两个参数&#xff0c;如果存在一个数字不大于0就返回0&#xff0c;利用上面的公式就可以得出最后的结果。

电脑远程控制另一台电脑怎么弄?

可以远程控制另一台电脑吗&#xff1f; “你好&#xff0c;我对远程访问技术不太了解。现在&#xff0c;我希望我的朋友可以远程控制我的Windows 10电脑&#xff0c;以便她能帮我解决一些问题。请问&#xff0c;有没有免费的方法可以实现这种远程控制&#xff1f;我该如何操作…

机器学习大模型驱动:未来的趋势与应用

文章目录 &#x1f4d1;前言一、什么是机器学习大模型&#xff1f;1.1 大模型的特点1.2 大模型的技术基础 二、大模型的技术实现2.1 Transformer 架构2.2 预训练和微调2.3 模型并行和数据并行 三、大模型的应用场景3.1 自然语言处理&#xff08;NLP&#xff09;3.2 计算机视觉&…

SpringMVC源码解读[1] -Spring MVC 环境搭建

源码地址: https://github.com/chen-jiacheng/springmvc-quickstart 一、使用 IDEA 创建 Spring MVC 项目 直接创建项目即可 默认项目结构: springmvc-quickstart ├── pom.xml └── src├── main│ ├── java│ │ └── com│ │ └── chenjiache…