力扣经典题目之3无重复字符的最长子串

news/2025/2/3 14:14:41 标签: leetcode, 算法, 职场和发展, java, 数据结构

今天继续给大家分享一道力扣的做题心得今天这道题目是 无重复字符的最长子串3. 无重复字符的最长子串 - 力扣(LeetCode)

题目如下,点击上面题目名称即可跳转到力扣对应题目页面也来挑战这道题


1,题目分析

此题目不难,就是给我们了一个内容随机的一个字符串,在这其中找到一个不含重复字符的子串,如果没有做过此类找子串的题目那么我们就要学习一下专门用于解决此类型题的一个解题方法,叫做滑动窗口,这个方法在用于解决找各种子串问题上是一个非常好的方法下面我们来看如果使用此方法快速解决这道题目

2,解题思路

java">class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> set = new HashSet<>();
        // 使用双指针的方法来解决问题
        int left = 0; int right = 0;int maxLength = 0;

        // 循环遍历字符
        while(right < s.length()){
            char  a = s.charAt(right);

            // 如果字符不在当前子串中
            if(!set.contains(a)){
                set.add(a);
                right++;
            // 更新最大长度
            maxLength = Math.max(maxLength,right-left);
            }else{
                // 如果当前的子串中存在此字符,则移除左指针指向的字符并且移动左指针
                set.remove(s.charAt(left));
                left++;

            }

        }
        return maxLength;
        
    }
}

解题思路

  1. 数据结构选择:使用HashSet来存储当前窗口中的字符,以实现O(1)时间复杂度的重复性检查。

  2. 双指针维护窗口

    • left指针标记窗口的起始位置。

    • right指针不断扩展窗口的结束位置。

  3. 窗口扩展与收缩

    • right指向的字符不在集合中时,将其加入集合,并扩展窗口(right右移)。

    • 若字符已存在,则通过移动left指针逐个移除字符,直到重复字符被移出窗口。

  4. 更新最大长度:每次成功扩展窗口后,计算当前窗口长度并更新最大值。

题解的正确性分析

  • 确保窗口唯一性:通过HashSet的检查和指针调整,保证窗口内字符始终唯一。

  • 时间复杂度O(n):每个字符最多被leftright访问一次,总体操作次数为2n。

  • 空间复杂度O(min(n, m)):m为字符集大小,例如ASCII字符集时为O(1)。

解题关键点

  • 滑动窗口机制:通过动态调整窗口边界,高效地遍历所有可能的子串。

  • 即时更新最大值:仅在窗口扩展时更新最大值,避免无效计算。

  • 逐步调整左指针:确保重复字符完全移出后,继续扩展窗口,不漏解。

4,总结

        感谢大家的阅读,希望这篇解题心得能为大家带来一些收获,我们共同进步!大家的点赞就是我的动力谢谢大家,还有什么更优解或者问题欢迎大家在评论区讨论分享!


http://www.niftyadmin.cn/n/5840861.html

相关文章

035 搜索之DFS基础

DFS&#xff1a;深度优先搜索——本质上是暴力枚举&#xff0c;尽可能一条路走到底&#xff0c;走不了回退 1.DFS与n重循环 例&#xff1a;给定一个数字x&#xff0c;将其拆分为3个正整数&#xff0c;后一个要求大于前一个&#xff0c;给出方案。 分析&#xff1a;这种情况下…

如何实现滑动列表功能

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了沉浸式状态栏相关的内容&#xff0c;本章回中将介绍SliverList组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的SliverList组件是一种列表类组件&#xff0c;类似我们之前介…

使用Visual Studio打包Python项目

1. 安装Visual Studio 首先&#xff0c;你需要在你的计算机上安装Visual Studio。 2. 创建项目 在Visual Studio中创建一个新的Python项目。 打开Visual Studio&#xff0c;点击“File”&#xff08;文件&#xff09; -> “New”&#xff08;新建&#xff09; -> “Pr…

《手札·开源篇》从开源到商业化:中小企业的低成本数字化转型路径 ——以Odoo为数据中台低成本实现售前售中一体化

某机电设备有限公司数字化转型案例&#xff1a;以Odoo为数据中台实现售前售中一体化 一、企业背景某机电设备有限公司在机电设备领域历经多年发展&#xff0c;业务广泛&#xff0c;涵盖工业自动化设备、电力设备等产品的销售与服务。随着业务版图不断拓展&#xff0c;企业面临…

稀疏进化训练:机器学习优化算法中的高效解决方案

稀疏进化训练&#xff1a;机器学习优化算法中的高效解决方案 稀疏进化训练&#xff1a;机器学习优化算法中的高效解决方案引言第一部分&#xff1a;背景与动机1.1 传统优化算法的局限性1.2 进化策略的优势1.3 稀疏性的重要性 第二部分&#xff1a;稀疏进化训练的核心思想2.1 稀…

每天学点小知识之设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解模板方法模式 模板方法模式是结构最简单的行为型设计模式&#xff0c;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式&#xff0c;可以将一些复杂流程的实现步骤封装在一系列基…

【Redis】Redis 经典面试题解析:深入理解 Redis 的核心概念与应用

Redis 是一个高性能的键值存储系统&#xff0c;广泛应用于缓存、消息队列、排行榜等场景。在面试中&#xff0c;Redis 是一个高频话题&#xff0c;尤其是其核心概念、数据结构、持久化机制和高可用性方案。 1. Redis 是什么&#xff1f;它的主要特点是什么&#xff1f; 答案&a…

在Qt中,slots 关键字有什么用?

有下面的Qt代码&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr…