【算法篇】无重复字符的最长子串

无重复字符的最长子串

  • 题目描述:给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。

  • 示例 1:

输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

  • 示例 2:
    输入: s = “bbbbb”
    输出: 1
    解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

  • 示例 3:
    输入: s = “pwwkew”
    输出: 3
    解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

  • 提示:
    0 <= s.length <= 5 * 104
    s 由英文字母、数字、符号和空格组成

解题思路

方法一:滑动窗口
  1. 初始化最长子串长度maxLength为0,滑动窗口起始位置start为0,以及一个字符索引映射charIndexMap
  2. 遍历字符串s,对于每个字符:
    • 检查当前字符是否已经在映射中存在,并且其索引大于等于当前窗口的起始位置。
    • 如果存在,更新窗口的起始位置到重复字符的下一个位置。
    • 更新当前字符的索引。
    • 更新最长子串的长度。
  3. 返回最长子串的长度。

方法一JavaScript版:

function lengthOfLongestSubstring(s) {let maxLength = 0; // 最长子串的长度let start = 0; // 滑动窗口的起始位置let charIndexMap = new Map(); // 用于存储字符及其索引的映射for (let end = 0; end < s.length; end++) {const currentChar = s[end];// 如果当前字符已经在映射中存在,并且其索引大于等于当前窗口的起始位置if (charIndexMap.has(currentChar) && charIndexMap.get(currentChar) >= start) {// 更新窗口的起始位置到重复字符的下一个位置start = charIndexMap.get(currentChar) + 1;}// 更新当前字符的索引charIndexMap.set(currentChar, end);// 更新最长子串的长度maxLength = Math.max(maxLength, end - start + 1);}return maxLength;
}// 示例
console.log(lengthOfLongestSubstring("abcabcbb")); // 3
console.log(lengthOfLongestSubstring("bbbbb")); // 1
console.log(lengthOfLongestSubstring("pwwkew")); // 3
方法二:双指针(扩展滑动窗口)
  1. 初始化最长子串长度maxLength为0,左指针left为0,右指针right为0,以及一个字符集合charSet
  2. 使用一个while循环移动右指针,对于每个字符:
    • 检查当前字符是否已经在集合中存在。
    • 如果存在,移动左指针直到重复字符被移出窗口。
    • 将当前字符添加到集合中。
    • 更新最长子串的长度。
    • 移动右指针。
  3. 返回最长子串的长度。

方法二JavaScript版:

function lengthOfLongestSubstring(s) {let maxLength = 0; // 最长子串的长度let left = 0; // 左指针let right = 0; // 右指针let charSet = new Set(); // 用于存储字符的集合while (right < s.length) {const currentChar = s[right];// 如果当前字符已经在集合中存在if (charSet.has(currentChar)) {// 移动左指针到重复字符的下一个位置while (s[left] !== currentChar) {charSet.delete(s[left]);left++;}left++; // 跳过重复字符}// 将当前字符添加到集合中charSet.add(currentChar);// 更新最长子串的长度maxLength = Math.max(maxLength, right - left + 1);// 移动右指针right++;}return maxLength;
}// 示例
console.log(lengthOfLongestSubstring("abcabcbb")); // 3
console.log(lengthOfLongestSubstring("bbbbb")); // 1
console.log(lengthOfLongestSubstring("pwwkew")); // 3

总结与类似题解题思路

解决无重复字符的最长子串问题的关键在于维护一个不包含重复字符的窗口,并动态更新这个窗口的大小。这可以通过以下步骤实现:

  1. 使用滑动窗口或双指针技术来维护窗口的边界。
  2. 使用哈希表(如Map)或集合(如Set)来快速检查字符是否存在于窗口中。
  3. 当遇到一个重复字符时,及时调整窗口的边界,确保窗口内始终无重复字符。
  4. 在每次迭代中,更新最长子串的长度。

对于类似的题目,如求最长连续子序列、最长递增子序列等,都可以采用类似的思路:定义窗口或序列的边界,使用辅助数据结构来维护窗口或序列的性质,并在迭代过程中更新结果。这种方法通常能够保证时间复杂度为O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析ETL与ELT架构:数据集成技术的演进与发展

摘要&#xff1a;随着大数据时代的到来&#xff0c;数据集成成为企业信息化建设的重要环节。本文将深入探讨ETL与ELT两种架构&#xff0c;分析它们在数据处理、性能、可扩展性等方面的差异&#xff0c;为企业数据集成提供技术指导。 一、引言 在大数据时代&#xff0c;企业需要…

第55集《摄大乘论》

《摄大乘论》&#xff0c;和尚尼慈悲、诸位法师、诸位居士&#xff0c;阿弥陀佛&#xff01;(阿弥陀佛&#xff01;)请大家打开《讲义》第一八四页&#xff0c;癸三、约甚深佛法释。 我们这一科是讲到增上心学&#xff0c;增上心学主要的宗旨&#xff0c;就是我们应该要如何透…

注解 - @RequestHeader

注解简介 在今天的每日一注解中&#xff0c;我们将探讨RequestHeader注解。RequestHeader是Spring框架中的一个注解&#xff0c;用于将HTTP请求头中的值绑定到控制器方法的参数上。 注解定义 RequestHeader注解用于从HTTP请求头中提取值&#xff0c;并将其绑定到控制器方法的…

13- 函数的定义与使用+形参实参区分

13- 函数的定义与使用形参实参区分 文章目录 13- 函数的定义与使用形参实参区分一、函数的定义与使用1.1 函数的结构1. 函数头2. 函数体 1.2 示例代码例子 1&#xff1a;无参数和无返回值的函数例子 2&#xff1a;带参数和返回值的函数 1.3 函数的基本语法1.4 函数的使用示例例…

Faster-RCNN基本思想和网络结构

简单来说&#xff0c;Faster RCNN RPN Fast RCNN RPN 是指 Region Proposal Network&#xff0c;建议区域生成网络。 Faster RCNN 中用 RPN 来代替了 Fast RCNN 中的SS算法。 算法流程&#xff1a; &#xff08;1&#xff09;将图像输入CNN网络得到相应的特征图。 &#x…

多态、虚函数表与动态绑定的深入解析

目录 多态简介 虚函数表与动态绑定 虚函数表 动态绑定机制 内存与性能影响 纯虚函数与抽象类 纯虚函数 抽象类 动态类型转换与typeid操作符 dynamic_cast typeid操作符 虚析构函数的重要性 在面向对象编程中&#xff0c;多态性是一种核心特性&#xff0c;它允许我们…

单机多卡分布式训练策略——MirroredStrategy

前言 分布式训练是一种用于在多个设备或机器上同时训练深度学习模型的技术&#xff0c;它有助于减少训练时间&#xff0c;允许使用更多数据更快训练大模型。分布式训练重点关注数据并行性&#xff0c;本次试验使用的是单机多卡的分布式训练策略&#xff0c;也就是 MirroredStr…

mvn install -DskipTests

mvn install -DskipTests mvn install -DskipTests 不用做测试的打包代码

Task vs Thread

C#中的Task和Thread都是用于实现多线程和并发操作的重要组件&#xff0c;但它们在设计哲学、使用场景和功能特性上存在显著差异&#xff0c;同时也有一些内在的联系。 Task vs Thread 设计理念: Thread: 是操作系统级别的资源&#xff0c;代表了独立的执行路径。它是较为底层…

算法题目学习汇总

1、二叉树前中后序遍历:https://blog.csdn.net/cm15835106905/article/details/124699173 2、输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点&#xff0c;只能调整树中结点指针的指向。 public class Solution {private Tr…

多模态AI的挑战与早期壁垒的构建

伴随着Sora、GPT40的推出&#xff0c;多模态AI逐渐成为研究的热点和应用的趋势。然而&#xff0c;多模态AI的发展并非一帆风顺&#xff0c;它面临着诸多挑战和壁垒。 一、多模态AI的难点 多模态AI的核心在于将不同模态的信息&#xff08;如文本、图像、音频、视频等&#xff…

离线翻译器下载哪个好?这几个翻译器用过的人都说好

面对跨文化交流的挑战&#xff0c;如国际旅行或多元工作环境&#xff0c;语言障碍尤为突出。 特别是在信号弱或无网络覆盖的地区&#xff0c;翻译需求变得更加迫切。此时&#xff0c;一款优质的离线翻译app显得尤为重要。它能够在没有网络支持的情况下提供即时翻译服务&#x…

事实与价值很难对齐的原因

事实与价值的对齐是一个复杂的问题&#xff0c;因为事实通常是客观的、可观察的和基于证据的&#xff0c;而价值则是主观的、个人的和基于信仰或偏好的。事实与价值很难对齐的原因有以下几点&#xff1a; 1、事实的客观性和价值的主观性 事实是客观存在的&#xff0c;而价值则是…

空间数字孪生及应用

空间数字孪生&#xff08;SDT&#xff09;本质上是现实世界地理空间对象&#xff08;例如&#xff0c;建筑物、道路&#xff09;和系统&#xff08;例如&#xff0c;环境或交通监控&#xff09;的镜像表示。地理空间协会正式定义SDT为具有精确位置和维度属性的虚拟表示&#xf…

CF297C Splitting the Uniqueness 题解

CF297C Splitting the Uniqueness 题解 非常好构造题&#xff0c;使我的草稿纸旋转。 解法 我们记输入的数组为 a a a&#xff0c;需要输出的两个数组为 b , c b,c b,c&#xff08;因为当时起变量名起的&#xff09;。 考虑利用 a i a_i ai​ 互不相同的性质。 先将 a…

二叉树顺序结构——堆的结构与实现

二叉树顺序结构——堆的结构与实现 一、二叉树的顺序结构二、堆的概念及结构三、堆的实现堆向下调整算法堆的创建建堆时间复杂度堆的插入(堆向上调整算法)堆的删除堆的代码实现(使用VS2022的C语言)初始化、销毁构建、插入、删除返回堆顶元素、判空、返回有效元素个数 四、完整 …

20240610 基于QGIS生成地区示意图的地图shp文件

目录 本文目标前置条件具体步骤1. 创建Project2. 插入世界地图3. 对地区示意图进行地理匹配4. 创建shp文件&#xff0c;勾画轨迹 注意事项 本文目标 基于QGIS生成地区示意图的地图shp文件&#xff0c;此shp文件可以用来学习&#xff0c;但是未经审批不可用于发表。 前置条件 …

Python基础教程(十一):数据结构汇总梳理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

10.3 Go 同步与通信

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Android Studio Jellyfish版本修改project使用特定jdk版本的步骤

android studio总是把这些东西改来改去让人十分恼火&#xff0c;IDE本身改来改去就让人无法上手就立即工作&#xff0c;很多时间浪费在IDE和gradle的配置和奇奇怪怪现象的斗智斗勇上&#xff0c;搞Android是真的有点浪费生命。一入此坑深不见底 jellyfish版安卓studio已经无法通…