当前位置: 首页 > article >正文

[Java恶补day8] 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 ∗ 10 4 5 * 10^4 5104
s 由英文字母、数字、符号和空格组成


知识点:
滑动窗口、哈希表、字符串


根据官解,有以下结论
①一旦涉及出现次数 ,就需要使用哈希表。
字符串类型的题:key=字符,value=出现次数
②一旦涉及子串,通常能通过滑动窗口进行动态扩张


解:
首先,对空字符串进行处理,直接返回0,提高效率。

然后,定义变量max存储最长子串的长度。定义一个HashMap,存储每个字符在字符串中出现的下标。此外,定义一个start变量,表示滑动窗口的起始下标。

接着,for循环遍历整个字符串,通过s.charAt(i)获取当前遍历的字符

在for循环内:
1、若当前遍历的字符没在map中,那么通过map.put(s.charAt(i), i);将当前字符加入map,能保证滑动窗口内无重复字符,这里键值对的value=i,表示的是当前遍历的字符的下标。
2、若当前遍历的字符在map中,我们要进行if-else判断:
①若当前遍历的这个重复字符,目前在滑动窗口内,则移动滑动窗口的左边界start到当前遍历的字符的下一个位置。原因是:既然重复的字符在滑动窗口内,如果左边界还是在滑动窗口内的这个字符的位置,或者是滑动窗口内的这个字符的左侧,整个滑动窗口还是重复的,没有必要这么做,因此我们直接让start移动到map.get(s.charAt(i)) + 1的位置
这里以测试样例3说明原因中的第一点。第二点根据文字描述即可想象出情况,就不例举了。
原因1说明(测试样例3)
②若当前遍历的这个重复字符,在滑动窗口前面,则不处理。因为我们看的就是滑动窗口内的情况,不考虑滑动窗口外的情况
在上面的重复字符处理结束后,通过map.put(s.charAt(i), i);将当前字符加入map。

最后,我们通过Math.max(max, i - start + 1)获取每次滑动窗口遍历的最长子串的长度。

最终返回max变量。

class Solution {public int lengthOfLongestSubstring(String s) {//空字符串直接返回if (s.length() == 0) {return 0;}//最长子串长度int max = 0;//HashMap存储每个字符出现在字符串中的下标Map<Character, Integer> map = new HashMap<>();//滑动窗口起始下标int start = 0;//end = i: 隐式表示滑动窗口结束下标//遍历字符串的每个字符for (int i = 0; i < s.length(); i++) {//已出现过当前遍历的字符if (map.containsKey(s.charAt(i))) {//若当前遍历的这个重复字符,目前在滑动窗口内,则移动start到这个重复字符的下一个位置if (map.get(s.charAt(i)) >= start && map.get(s.charAt(i)) <= i) {start = map.get(s.charAt(i)) + 1;}//若当前遍历的这个重复字符,在滑动窗口前面,则不处理else if (map.get(s.charAt(i)) < start) {start = start;}}//将当前遍历字符加入map//1.当前遍历字符不在map中,则滑动窗口内必无重复字符//2.当前遍历字符在map中,而此时已完成滑动窗口边界的处理,此时字符也不会在滑动窗口中重复出现map.put(s.charAt(i), i);//获取当前子串的长度max = Math.max(max, i - start + 1);//数组下标从0开始,则子串长度需要加1}return max;}
}

引用:

  1. java遍历String字符串的方法

相关文章:

[Java恶补day8] 3. 无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “…...

LabVIEW教学用开发平台

一、培训目标 基础编程&#xff1a;掌握 LabVIEW 数据类型、程序结构、子 VI 设计与调试技巧。 硬件通信&#xff1a;精通 RS-232/485、TCP/IP、Modbus、PLC 等工业通信协议及实现。 高级设计模式&#xff1a;熟练运用状态机、生产者 - 消费者模式构建复杂测控系统。 项目实…...

Package Size Comparison – 6 Leads

Package Size Comparison 6 LeadsTSOP SOT SM SMT SOT23 SC-74 SC-59 SC-88 SOT363 US6 UMT6 SC-70 SOT563 ES EMT SC-75-6...

python打卡day38

Dataset和DataLoader 知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 在遇到大规模数据集时&#xff0c…...

vLLM 核心技术 PagedAttention 原理详解

本文是 vLLM 系列文章的第二篇&#xff0c;介绍 vLLM 核心技术 PagedAttention 的设计理念与实现机制。 vLLM PagedAttention 论文精读视频可以在这里观看&#xff1a;https://www.bilibili.com/video/BV1GWjjzfE1b 往期文章&#xff1a; vLLM 快速部署指南 1 引言&#xf…...

rpm安装jenkins-2.452

rpm安装jenkins-2.452 一、下载和安装 1、Jenkins下载 版本2.452可用windows下载: https://mirrors.jenkins-ci.org/redhat-stable/jenkins-2.452.4-1.1.noarch.rpm 其他版本 wget https://pkg.jenkins.io/redhat-stable/jenkins-2.440.3-1.1.noarch.rpm 2、jenkins安装 $r…...

《软件工程》第 2 章 -UML 与 RUP 统一过程

在软件工程领域&#xff0c;UML&#xff08;统一建模语言&#xff09;与 RUP&#xff08;统一过程&#xff09;是进行面向对象软件开发的重要工具和方法。接下来&#xff0c;我们将深入探讨第 2 章的内容&#xff0c;通过案例和代码&#xff0c;帮助大家理解和掌握相关知识。 …...

(转)Docker与K8S的区别

1 定义角度 Docker是一种开放源码的应用容器引擎&#xff0c;允许开发人员将其应用和依赖包打包成可移植的容器/镜像中&#xff1b;然后&#xff0c;发布到任何流行的 Linux 或 Windows 机器上&#xff0c;也能实现虚拟化。该容器完全使用沙箱机制&#xff0c;彼此之间没有任何…...

服务器数据迁移

写在前面&#xff1a;为满足业务需求&#xff0c;我们采购了一台新的高性能服务器&#xff0c;现在想把旧服务器中的用户文件以及conda环境等迁移到新服务器中去。为了保证迁移过程尽可能不出错&#xff0c;并且迁移后新的服务器可以直接使用&#xff0c;以下方案提供一个稳健、…...

VB.NET与SQL连接问题解决方案

1.基本连接步骤 使用SqlConnection、SqlCommand和SqlDataReader进行基础操作&#xff1a; vb.net Imports System.Data.SqlClient Public Sub ConnectToDatabase() Dim connectionString As String "ServermyServerAddress;DatabasemyDataBase;Integrated Security…...

商用密码 vs 普通密码:安全加密的核心区别

商用密码 vs 普通密码&#xff1a;安全加密的核心区别 一. 引言&#xff1a;密码的世界二. 什么是普通密码&#xff1f;三. 什么是商用密码&#xff1f;四. 普通密码 vs 商用密码&#xff1a;核心区别五. 选择合适的密码方案六. 结语 前言 肝文不易&#xff0c;点个免费的赞和…...

MYSQL中的分库分表及产生的分布式问题

分库分表是分布式数据库架构中常用的优化手段&#xff0c;用于解决单库单表数据量过大、性能瓶颈等问题。其核心思想是将数据分散到多个数据库&#xff08;分库&#xff09;或多个表&#xff08;分表&#xff09;中&#xff0c;以提升系统的吞吐量、查询性能和可扩展性。 一&am…...

拥塞控制算法cubic 和bbr

1. 背景 CUBIC 和 BBR 是两种用于网络流量控制的拥塞控制算法&#xff0c;广泛应用于传输中&#xff0c;本质上是用于提升网络速度、稳定性和效率的方案。CUBIC 和 BBR 在本质思想、设计目标和工作方式上存在很大的差异&#xff0c;以下是两者的详细对比。 1.1 CUBIC 提出者…...

投影机三色光源和单色光源实拍对比:一场视觉体验的终极较量

一、光源技术&#xff1a;从 “单色模拟” 到 “三色原生” 的进化 &#xff08;一&#xff09;单色光源&#xff1a;白光的 “色彩魔术” 单色光源投影机采用单一白光作为基础光源&#xff0c;通过LCD上出现色彩呈现颜色。这种技术路线的优势在于成本可控&#xff0c;早期被广…...

电子电气架构 --- 下一代汽车电子电气架构中的连接性

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

解析极限编程-拥抱变化(第2版)笔记

思维导图&#xff08;转载&#xff09; https://www.cnblogs.com/OneFri/p/17055449.html 极限编程&#xff08;XP&#xff09;是以人为核心、响应变化、持续交付价值的软件开发方法论 1.核心思想与价值观 XP 建立在 5 个核心价值观 之上&#xff1a; 价值观含义说明沟通团…...

手写Tomcat(一)

一、Tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。 1.1 Tomcat基本架构 Servlet接口文件中定义的方法有以下…...

【机器学习基础】机器学习入门核心算法:支持向量机(SVM)

机器学习入门核心算法&#xff1a;支持向量机&#xff08;SVM&#xff09; 一、算法逻辑1.1 基本概念1.2 核心思想线性可分情况 二、算法原理与数学推导2.1 原始优化问题2.2 拉格朗日对偶2.3 对偶问题2.4 核函数技巧2.5 软间隔与松弛变量 三、模型评估3.1 评估指标3.2 交叉验证…...

定时清理流媒体服务器录像自动化bash脚本

定时清理流媒体服务器保存录像文件夹 首先创建一个文件,解除读写权限 touch rm_videos.sh chmod 777 rm_videos.sh将内容复制进去&#xff0c;将对应文件夹等需要修改的内容&#xff0c;根据自己的实际需求进行修改 #!/bin/bash# 设置目标目录&#xff08;修改为你的实际路…...

Logi鼠标切换桌面失效

Mac上习惯了滑屏切换桌面&#xff0c;所以Logi鼠标也定制了切换桌面的动作&#xff0c;有一天发现这个动作失效了&#xff0c;且只有切换桌面的动作失效。 发现Logi Options出现了这个提示&#xff0c;如图所示&#xff08;具体原因未知&#xff0c;已配置不自动更新版本&…...

Go语言之匿名字段与组合 -《Go语言实战指南》

Go 没有传统的面向对象继承机制&#xff0c;但它通过“匿名字段&#xff08;embedding&#xff09;”实现了类似继承的组合方式&#xff0c;使得一个类型可以“继承”另一个类型的字段和方法。 一、什么是匿名字段 匿名字段就是在结构体中嵌套一个类型而不显式命名字段名。该字…...

Linux 进阶命令篇

一、Linux 系统软件安装命令 &#xff08;一&#xff09;Ubuntu 系统&#xff08;基于 Debian&#xff09; apt &#xff1a;是 Ubuntu 系统中常用的包管理工具&#xff0c;可以自动处理软件依赖关系。 安装命令格式 &#xff1a;sudo apt install 软件名 示例 &#xff1a;…...

OpenCV CUDA模块图像处理------颜色空间处理之拜耳模式去马赛克函数demosaicing()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于在 GPU 上执行拜耳图像&#xff08;Bayer Pattern&#xff09;的去马赛克操作&#xff08;Demosaicing&#xff09;&#xff0c;将单通…...

2025年全国青少年信息素养大赛复赛C++集训(15):因子问题(题目及解析)

2025年全国青少年信息素养大赛复赛C集训&#xff08;15&#xff09;&#xff1a;因子问题&#xff08;题目及解析&#xff09; 题目描述 任给两个正整数N、M&#xff0c;求一个最小的正整数a&#xff0c;使得a和(M-a)都是N的因子。 时间限制&#xff1a;10000 内存限制&…...

如何通过仿真软件优化丝杆升降机设计

通过仿真软件优化丝杆升降机设计可从多维度入手&#xff0c;以下为具体方法和分析&#xff1a; 一、基于有限元分析的结构优化 材料优化&#xff1a;通过ANSYS等软件建立三维模型&#xff0c;施加实际工况载荷&#xff08;如轴向力、径向力、扭矩&#xff09;&#xff0c;计算…...

Vue3进阶教程:1.初次了解vue

1.初次了解vue vue文件目录和各个文件在这里不做介绍 此课程对针对有点vue基础的同学&#xff0c;或者看过我上部分vue的教程 与之前我的Vue教程不同的是&#xff0c;写法和内容有区别 真正的了解Vue3 1.创建vue组件 1.npm create vuelatest 2.取名 3.TS要选上 4.其他先不选 5…...

WordPress免费网站模板下载

大背景图免费wordpress建站模板 这个wordpress模板设计以简约和专业为主题&#xff0c;旨在为用户提供清晰、直观的浏览体验。以下是对其风格、布局和设计理念的详细介绍&#xff1a; 风格 简约现代&#xff1a;整体设计采用简约风格&#xff0c;使用了大量的白色和灰色调&am…...

【深度学习新浪潮】以图搜地点是如何实现的?(含大模型方案)

1. 以图搜地点的实现方式有哪些? 扫描手机照片中的截图并识别出位置信息,主要有以下几种实现方式: 通过照片元数据获取: 原理:现代智能手机拍摄的照片通常会包含Exif(Exchangeable Image File)元数据。Exif中除了有像素信息之外,还包含了光圈、快门、白平衡、ISO、焦距…...

element的el-table翻页选中功能

el-table翻页选中功能 row-key"enterpriseWorkerId" selection-change"handleSelectionChange"<el-table-column type"selection" :reserve-selection"true" width"55"></el-table-column>stuMultipleList: []…...

Python打卡训练营学习记录Day38

知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import torch import torch.nn as nn import torch.opt…...