【面试经典150 | 滑动窗口】无重复字符的最长子串

news/2024/5/20 6:06:47 标签: 双指针, 滑动窗口, 字符串, C++, 算法

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

双指针】【滑动窗口】【字符串


题目来源

面试经典150 | 3. 无重复字符的最长子串


题目解读

本题题目要求明确,找出最长的子字符串的长度,该子字符串中没有重复的字符。

注意:子串指的是连续子串不是子序列。


解题思路

数据量为 5 × 1 0 4 5 \times 10^4 5×104,时间复杂度为 O ( n 2 ) O(n^2) O(n2) 的方法一定过不了,能过的一定是时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn) O ( n ) O(n) O(n) 或者更小的方法。

方法一:滑动窗口

双指针的方法,left 维护无重复子串的起点,right 维护无重复子串的终点,初始时left=0right=-1。维护一个答案变量 res,初始 res=0

本题中,我们相对固定左指针 left,在当前左指针作为无重复字符的起点的情况下寻找可以到达的最远位置。

双指针从起点出发:

  • 如果遇到重复字符或者数组边界时,更新答案 res=max(res, right - left + 1)
  • 否则向右移动右指针,以 left 为起点的无重复字符找完之后,右移左指针。

实现上,可以用一个无序集合 st 辅助记录无重复的字符,当 st.find(c) == 1 时表示 c 在当前的字符串中了,否则将 c 放入无序集合中。当左指针移动时,需要移除左指针上一个指向位置的元素。

双指针的第一个指针的更新过程可以使用for循环代替while循环,并不会影响时间复杂度。

实现代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> set;
        int n = s.size();
        // rk是不包含重复字符的最长子串的结束位置
        int rk = 0, ans = 0;

        // 枚举左指针的位置
        for (int i = 0; i < n; ++i) {
            if (i != 0) {
                set.erase(s[i-1]);
            }

            while (rk < n && !set.count(s[rk])) {
                set.insert(s[rk]);
                ++rk;
            }
            ans = max(ans, rk - i); // 无重复的子串范围为 [i, rk-1]
        }
        return ans;
    }
};

复杂度分析

时间复杂度 O ( n ) O(n) O(n) n n n字符串的长度。

空间复杂度 O ( m ) O(m) O(m) m m m字符串中出现的无重复字符总数。


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。


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

相关文章

基于springboot+vue的客户关系管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

并发编程之并发理论篇--内存模型

目录 一、Java内存模型的介绍 二、内存模型抽象结构 三、主内存与工作内存 四、内存间交互操作 五、内存模型三大特性 六、内存屏障 七、先行发生原则 八、代码示例 一、Java内存模型的介绍 线程安全是指在多个线程同时访问同一个对象时&#xff0c;无论线程调度和交替…

肖sir__项目实战讲解__004

项目实战讲解 一、项目的类型 金融类&#xff1a; 保险(健康险理财险)、证券、基金(股票型基金、混合型基金、指数型基金、债券型基金、 天天基金网&#xff08;ETF基金、货币型基金、量化基金)、银行、贷款、信用卡、外汇、二元期权、期货原油、blockchain、 数字货币、黄金白…

人工智能安全-2-非平衡数据处理(2)

5 算法层面 代价敏感&#xff1a;设置损失函数的权重&#xff0c;使得少数类判别错误的损失大于多数类判别错误的损失&#xff1b; 单类分类器方法&#xff1a;仅对少数类进行训练&#xff0c;例如运用SVM算法&#xff1b; 集成学习方法&#xff1a;即多个分类器&#xff0c;然…

Java多线程编程- Wait等待超时控制

前言&#xff1a; 本文是基于《Java多线程编程实战指南》第五章个人理解&#xff0c;因为第五章内容很多&#xff0c;因此拆成了很多文章&#xff0c;源码是摘抄作者的源码&#xff0c;源码会加上自己的理解。 读书笔记目前笔者正在更新如下&#xff0c; 《Java多线程编程实战…

【二分法查找】

使用二分法查找需要注意的点&#xff1a; 使用二分法的前提&#xff1a; 数组为有序数组&#xff0c;同时题目还强调数组中无重复元素。 二分法经常写乱&#xff0c;主要是因为对区间的定义没有想清楚&#xff0c;区间的定义就是不变量。要在二分查找的过程中&#xff0c;保持…

浅谈低压绝缘监测及定位系统在海上石油平台的研究与应用

安科瑞 华楠 摘要&#xff1a;海上石油平台低压系统与陆地电力系统有很大区别&#xff0c;其属于中性点绝缘系统&#xff0c;在出现单相接地故障时&#xff0c;系统允许带故障正常运行2 h&#xff0c;保证海上重要电气设备不会立即关停。现以渤海某海上平台为例&#xff0c;其…

第1篇 目标检测概述 —(1)目标检测基础知识

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测是计算机视觉领域中的一项任务&#xff0c;旨在自动识别和定位图像或视频中的特定目标&#xff0c;目标可以是人、车辆、动物、物体等。目标检测的目标是从输入图像中确定目标的位置&#xff0c;并使用边界框将其标…