【LeetCode 力扣】3.无重复字符的最长子串 Java实现 滑动窗口

LeetCode 3. 无重复字符的最长子串(动态规划,HashMap,Java) 本题与剑指 Offer 48. 最长不含重复字符的子字符串一致 题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 阅读详情

题目链接:3.无重复字符的最长子串

1 原题描述:在这里插入图片描述

2 解题思路

初看此题,其实并不难理解,我们一共有两个指针,一个时我们子串的头 start ,一个是我们子串的尾 end。我们的尾 end 依次加一,然后判断一下start 到 end - 1 之间有没有和 end 重复的字母。若存在下标为 i 的字母和 end 重复,那么我们需要将我们的头 start 变到当前重复 i 的下一个,也就是 s t a r t = i + 1 start = i + 1 start=i+1 ,这样我们的两个指针之间的范围就会不断变化,并且满足题目所说的是一个 不重复 的子串。而这两个指针之间的内容就如同窗口一样,两个指针的变化就是滑动,这就是我们常见的滑动窗口。而我们只需要每次都计算一下当前窗口的长度,然后和之前的最大值相比,保存一个更大的值即 m a x = M a t h . m a x ( m a x , e n d − s t a r t + 1 ) ; max = Math.max(max, end - start + 1); max=Math.max(max,end−start+1);

可能还有小伙伴,不太理解,为什么这样滑动能确保我们的窗口能找到长度最长的子串呢?不妨我们看一下下面的几个例子吧。

  • ( a b c d ) a d e (abcd)ade (abcd)ade 接下来我们又将获取一个a,而这个a存在重复值,那么我们的 start 将移动到重复值的下一个,也就是 a ( b c d a ) d e a(bcda)de a(bcda)de
  • ( a b c d ) b d e (abcd)bde (abcd)bde 接下来我们又将获取一个b,而这个b存在重复值,那么我们的 start 将移动到重复值的下一个,也就是 a b ( c d b ) d e ab(cdb)de ab(cdb)de

观察上面两个例子,我们简单的来说,若想包含第一个重复值,那么 end 就无法向第二个重复值后移动。若想包含第二个重复值,那么 start 必须在第一个重复值后面。

相信大家也就理解了什么是滑动窗口,以及如何求出最长的子串了,那么我们来看看代码是怎么实现的呢?

代码实现1:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int max = 0;
        for(int start = 0, end = 0; end < s.length(); end++){
            char ch = s.charAt(end);
            for(int i = start; i < end; i++){
                if(ch == s.charAt(i)){
                    start = i + 1;
                    continue;
                }
            }
            max = Math.max(max, end - start + 1);
        }
        return max;
    }
}

虽然说,我们代码写出来了,可我们可以发现,我们的时间只击败了 19.9% 的人,说明我们还有很大的改进空间。
在这里插入图片描述
可以算出我们上面的代码时间复杂度为 O ( n 2 ) O(n^2) O(n2),那我们怎么优化呢?观察后可发现,我们找 start 到 end - 1 之间有没有和 end 重复的字母这部分代码的时间复杂度为 O ( n ) O(n) O(n) ,那我们对这里能优化吗?对了,我们可以使用哈希表来存储我们窗口之间的字母,并且我们需要知道该字母的下标,因此我们要采用 HashMap , key 用来存储字母, value 用来存储字符位置 +1,加 1 表示从字符位置后一个才开始不重复,这样start 更新就会变得更方便。同时由于 HashMap 的特性是不会存储两个一样的 key,那当窗口滑动时,我们存储新的重复字母就相当于只是修改了原 key 的 value 值。那么我们就可以使用 HashMap 中的 map.containsKey(s.charAt(end)) 来判断我们是否存在重复数字了,而大家也知道 containsKey 的时间复杂度为 O ( 1 ) O(1) O(1),用此替换了我们原本的方法后,我们时间复杂度就优化为 O ( n ) O(n) O(n) 了!

那么很轻松的,我们优化后的代码也就出来了!

代码优化:

class Solution {
   public int lengthOfLongestSubstring(String s) {
        int max = 0;
        Map<Character, Integer> map = new HashMap<>();
        for(int start = 0, end = 0; end < s.length(); end++){
            if(map.containsKey(s.charAt(end))){
                start = Math.max(map.get(s.charAt(end)), start);
            }
            max = Math.max(max, end - start + 1);
            map.put(s.charAt(end), end + 1);
        }
        return max;
    }
}
面试官:如何找出字符串中无重复最长子串? 前言 LeetCode第3题,“无重复字符的最长子串”,曾经面试的过程中遇到过的一道算法题。通过这道题,我们能够学到算法中一个比较常见的解题方法:滑动窗口算法。 由于LeetCode中很多题都是基于“滑动窗口算法”进行解答,因此本篇文章将重点放在“滑动窗口”上,而不仅仅是这道算法题。当理解了滑动窗口的基本原理之后,所有类似的题都可以轻易解答。 下面来看具体的题目和解题方法。 “无重复字符的最长子串” 题目链接:https://leetcode-cn.com/problems/longest-sub 阅读详情

相关推荐

最长不重复字符子串问题的解决方法(Java 实现)

以上代码中,我们使用了一个 HashSet 来存储窗口内的字符,判断字符是否重复。滑动窗口的过程中,通过更新 maxLength 来记录最长子字符串的长度,同时根据字符是否重复来调整窗口的左右边界。我们可以使用滑动窗口和哈希集合来解决这个问题。滑动窗口是一个固定大小的窗口,通过左右指针来滑动窗口的位置。哈希集合用于判断窗口内的字符是否重复。通过该算法,我们可以在线性时间复杂度下解决最长不重复字符子串的问题。给定一个字符串,我们需要找到其中最长的不包含重复字符的子字符串。

2301_79365003的博客 465

JAVA实现无重复最长字符串(滑窗问题)

滑窗算法的讲解与滑窗算法的一个实例(JAVA实现) 题目描述:给定一个字符串s,请你找出其中不含有重复字符的最长字符串的长度。

qq_56438516的博客 1377

LeetCode 第3题:无重复字符的最长子串

好了,今天我们详细讲解了LeetCode第3题“无重复字符的最长子串”的解题思路和实现。滑动窗口法是一种非常高效的解决方案,时间复杂度为 O(n),适用于大部分实际场景。最后提醒大家,不管是写代码还是挤地铁,找到最佳位置和路径都是一门学问。希望大家能在编码的旅途中找到属于自己的最佳“座位”。

Gemini的博客 501

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

你可以用滑动窗口来解决这个问题。 首先,初始化窗口的左端点 left 和右端点 right 为 0。然后,开始滑动窗口,即不断将 right 向右移动,直到窗口内的字符串包含重复的字符为止。在这个过程中,每当一个新的字符 c 被加入到窗口中,就用一个哈希表记录下字符 c 在窗口中最后出现的位置,并且每次更新答案。 当发现窗口中包含重复的字符时,就可以将 left 移动到这个重复字符最后出现的位置的...

weixin_35748962的博客 437

AUTOSAR Dem模块实战配置:从理论到代码生成的完整指南

本文提供了一份AUTOSAR Dem模块从理论到代码生成的完整实战配置指南。文章详细拆解了配置流程,涵盖Dem模块的核心角色、通用骨架搭建、事件与DTC映射、消抖机制配置,以及与BswM、EcuM、DCM等模块的联调方法,旨在帮助汽车电子工程师快速掌握诊断事件管理的关键配置步骤,生成可运行的代码。

3c4x5z6v7b的博客 455

conda环境的复制、备份操作

请确保将 source_env 替换为你要复制的现有环境的名称,并将 target_env 替换为你要创建的新环境的名称。要备份一个Conda虚拟环境,你需要将环境的配置信息和依赖包列表保存起来,以便在需要的时候能够重新创建相同的环境。要将现有的 conda 环境复制为其他环境,可以使用 conda create 命令并克隆已存在的环境。

Dollhan的博客 3772

java实现寻找最长无重复字符的子字符串

其中一种常见的方法是使用滑动窗口(sliding window)的技巧,即维护一个不含重复字符的子字符串,并用两个指针(start和end)表示其起始和结束位置。滑动窗口算法是一种常用的优化技巧,可以用来解决一些涉及数组或字符串的问题¹²³⁴⁵⁶。滑动窗口算法是一种在数组或字符串上执行操作的技术,它可以用一个固定大小的窗口来覆盖数组或字符串的一部分,然后不断地向前移动窗口,直到遍历完整个数组或字符串。滑动窗口算法通常用双指针来实现,一个指针表示窗口的左端,另一个指针表示窗口的右端。

WsWeiSente的博客 965

三维重建Fusion中的TSDF算法通俗描述

看个视频 https://www.youtube.com/watch?v=8M_-lSYqACo 这是mobilefusion的视频,大家先了解一下,看到在三维重建的时候外面有个长方体包围盒了吗? 数据准备: 我们不同角度拍摄的RGB图、深度图和相应的pose.txt。 步骤: 1.建立长方体包围盒 要建立一个长方体包围盒。让所有的三维点都在这个长方体里面。 假设z方向垂直相机。 很明显,x,y方...

qq_30339595的博客 1万+

LeetCode第3题无重复字符的最长子串-java实现-图解思路与手撕代码-滑动窗口

LeetCode第3题无重复字符的最长子串-java实现-图解思路与手撕代码-滑动窗口

weixin_45271005的博客 818

【八股】JUC并发编程篇

👉抽象队列同步器,就是一种锁,内部维护的是一个先进先出的双向队列,队列中存储的是排队的线程,用state来标识是否有线程获得锁【0是无锁状态】👉流程:当一个线程拿到锁后会修改state = 1,这时如果有其他线程访问则会进入队列进行排序,直到state变成0后,队头线程才会拿到锁。在对state进行修改时,用的是CAS操作,所以可以保证原子性。👉它可以实现公平锁或非公平锁【默认】,上述是一个公平锁。如果新线程和队头线程抢锁资源就是非公平锁。

qq_44768318的博客 552

把 SAP BTP Destination 写进 MTA:一段 com.sap.application.content 配置背后的部署编排学

MTA内容模块解析:SAP BTP中的声明式部署机制 本文详细解析了mta.yaml中com.sap.application.content模块在SAP BTP云环境中的作用。该模块通过声明式配置实现内容投递,无需编译或部署代码。核心功能包括: Destination创建:通过content-target:true标识将配置投递到Destination服务 HTML5应用部署:将静态资源投递到HTML5 Application Repository 安全集成:配置XSUAA服务实现OAuth2用户令牌交换

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 165

力扣(LeetCode):#3-无重复字符的最长子串

文章目录力扣(LeetCode):#3-无重复字符的最长子串题目描述:题解:方法一:滑动窗口 力扣(LeetCode):#3-无重复字符的最长子串 题目描述: 题解: 方法一:滑动窗口 C++ class Solution { public: int lengthOfLongestSubstring(string s) { // 哈希集合,记录每个字符是否出现过 unordered_set<char> occ; int n = s.s

忘尘丶莫负的博客 371

从零到一破解Uber实时行程API:逆向工程与高并发爬虫实战

在数据采集领域,Uber的实时行程数据始终处于“传说级”难度。动态令牌系统- 每30秒轮换的Bearer Token证书固定(Certificate Pinning)- 阻止中间人攻击请求签名算法- 基于时间戳+用户设备的HMAC-SHA256行为分析- 鼠标轨迹、请求间隔的机器学习模型全链路加密- GraphQL端点的payload加密目录前言:为什么Uber爬虫被称为“地狱难度”?第一章:环境准备与法律边界1.1 技术栈选择(2026年最新)1.2 法律免责声明。

2201_76125261的博客 892

LeetCode题库整理【Java】—— 3 无重复字符的最长子串

LeetCode题库整理【Java】 ## 3 无重复字符的最长子串 题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “dvdf” 输出: 1 解释: 因为无重复字符的最长子串是 “vdf”,所以其长度为 3。 示例 3: 输入: “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案

qq_37975919的博客 194

idea出现 EXCEPTION_ACCESS_VIOLATION (0xc0000005) 的解决方法

idea启动的时候出现如下问题,以为没啥事,就索性关闭 后面再打开idea的时候发现直接闪退,之后打开其他软件,直接蓝屏

码农研究僧的博客 4817

C# MES通信从入门到精通(1)——串口传输文件

本文详细介绍了在Mes通信领域如何使用串口发送文件,由实战经验总结,堪称MES通信领域的葵花宝典!

qq_34059233的博客 3750

LeetCode-100题(Hot) 3. 无重复字符的最长子串 [滑动窗口] [Java实现]

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。 示例1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 --------------------------------------------------------------------------------------------------------------------------------- 本类题目关键在于对左指针的理解以及遇到重...

qq_51026595的博客 178

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java详解LeetCode 热题 100(08):LeetCode 3. 无重复字符的最长子串详解

理解子串与子序列的区别:子串必须是连续的字符序列使用滑动窗口:处理子串问题的常用技巧利用Map或Set:高效跟踪字符出现情况处理边界情况:注意空字符串等特殊输入。

yk_dflkg的博客 1094

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

leetcode3. 无重复字符的最长子串

leetcode3.无重复字符的最长子串 传送门 题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 输入: “abcabcbb” 输出: 3 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 滑动窗口 :使用 window 作为计数器记录窗口中的字符出现次数,然后先向右移动 right,当 window 中出现重复字符时,开始移动 left 缩小窗口,如此往复:...

lonelyVM的博客 126

【LeetCode-3】无重复字符的最长子串

【LeetCode-3】无重复字符的最长子串,解题思路:本题要求找出字符串中不含有重复字符的最长子串的长度。为了高效解决这个问题,可以使用滑动窗口和哈希表相结合的方法。以下是详细的解题思路:1. 滑动窗口的核心思想。滑动窗口是一种动态调整的区间,用于在数组或字符串中寻找满足某些条件的子区间。在本题中,滑动窗口的左右边界分别用两个指针 i 和 j 表示:● i:窗口的左边界,表示当前无重复子串的起始位置。● j:窗口的右边界,表示当前正在检查的字符的位置。通过移动这两个指针,我们可以动态地调整窗口

qq_44530108的博客 991

leetcode 3. 无重复字符的最长子串

leetcode 3. 无重复字符的最长子串题目java解法和思路总结 题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例2: 输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例3: 输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长.

m0_54479987的博客 181

Leetcode3 无重复字符的最长子串

Leetcode3 无重复字符的最长子串 题目描述 代码描述 public int lengthOfLongestSubstring(String s) { if (s==null||s.length()==0) return 0; HashMap<Character, Integer> map=new HashMap<>(); int res=0; ...

sparky的博客 167

LeetCode 3: 无重复字符的最长子串

LeetCode 3: 无重复字符的最长子串 Longest Substring Without Repeating Characters 题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 Given a string, find the length of the longest substring without repeating characters....

爱写Bug 205

LeetCode刷题记录:3. 无重复字符的最长子串-Longest Substring Without Repeating Characters

LeetCode刷题记录:3. 无重复字符的最长子串-Longest Substring Without Repeating Characters题目示例 1示例 2示例 3示例 4提示解题思路java实现相关知识滑动窗口滑动窗口协议(Sliding Window Protocol) 题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1 输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2 输入: s =

FF的博客 144

Java萌新闯力扣:3.无重复字符的最长子串

本人Java萌新,目前正备战蓝桥杯javaB组,算法基础薄弱,每天会更新一道力扣算法题详解,与大家一起交流,一起成长。

孤舟一叶~的博客 157

LeetCode3:Longest Substring Without Repeating Characters(无重复字符的最长子串)

LeetCode3:Longest Substring Without Repeating Characters(无重复字符的最长子串) 欢迎访问我的博客 LeetCode:https://leetcode.com/problems/longest-substring-without-repeating-characters/ LeetCodeCn:https://leetcode-cn.com/...

weixin_33772645的博客 93
上一篇: 【LeetCode 力扣】2.两数相加 Java实现 模拟 递归
下一篇: 【Mysql】更新多个数据库下同名表同名字段的长度
爱写BUG的老冉
博客等级 码龄8年 2357粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值