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

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

难度:中等

题目

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

示例:

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

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

提示:

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

解题思路:

这道题目的核心在于使用滑动窗口的思想来遍历字符串,寻找不含重复字符的最长子串。滑动窗口是一种处理数组/字符串区间问题的有效方法,它可以在遍历过程中动态调整待考察的子序列(窗口)。

  1. 初始化:定义两个指针left和right,分别表示当前窗口的左右边界,初始时都指向字符串的起始位置。同时,用一个哈希表(在JavaScript中可以使用对象或Map)来记录窗口内每个字符出现的最新位置,以方便快速判断字符是否重复。
  2. 扩大窗口:将右指针right逐步向右移动,每次移动都将right指向的字符加入哈希表,并更新该字符的最新位置。如果加入字符后没有造成重复(即新加入的字符的最新位置大于等于left),则说明窗口内的字符都是唯一的,此时可以更新最长子串长度。
  3. 缩小窗口:当加入字符导致重复时,就需要移动左指针left来缩小窗口,直到窗口内的字符再次变得唯一。在移动left的过程中,需要从哈希表中删除left指向的字符,因为这个字符已经不再属于窗口。
  4. 循环进行:重复步骤2和3,直到右指针达到字符串末尾。
  5. 返回结果:循环结束后,最长子串的长度即为所求。
/*** @param {string} s* @return {number}*/var lengthOfLongestSubstring = function (s) {let left = 0;let maxLength = 0;let charMap = new Map(); // 用于记录字符及其在字符串中的位置for (let right = 0; right < s.length; right++) {let currentChar = s[right];// 如果当前字符已经在窗口中存在,则需要更新左边界if (charMap.has(currentChar)) {left = Math.max(charMap.get(currentChar) + 1, left);}// 更新字符的最新位置charMap.set(currentChar, right);// 计算当前窗口的长度maxLength = Math.max(maxLength, right - left + 1);}return maxLength;
};

这段代码实现了上述的滑动窗口算法,通过不断调整窗口大小来寻找最长的无重复字符子串,并最终返回该子串的长度。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySql中modify、rename、change的用法和区别
  • CSS技巧专栏:一日一例 1.纯CSS实现 会讨好的热情按钮 特效
  • Java版Flink使用指南——从RabbitMQ中队列中接入消息流
  • 卷积神经网络——LeNet——FashionMNIST
  • tensorflow之欠拟合与过拟合,正则化缓解
  • Google Hacking
  • server nat表和会话表的作用及NAT地址转换详细
  • Linux 一键部署Mysql 8.4.1 LTS
  • 深度学习Day-24:ResNeXt-50算法思考
  • Kafka学习
  • PS怎么给图片打马赛克
  • 从 ArcMap 迁移到 ArcGIS Pro
  • linux创建定时任务
  • react启用mobx @decorators装饰器语法
  • nigix的下载使用
  • 【RocksDB】TransactionDB源码分析
  • 03Go 类型总结
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Webpack 4x 之路 ( 四 )
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • - 概述 - 《设计模式(极简c++版)》
  • 基于遗传算法的优化问题求解
  • 聊聊flink的BlobWriter
  • 我的zsh配置, 2019最新方案
  • 项目管理碎碎念系列之一:干系人管理
  • 译自由幺半群
  • Hibernate主键生成策略及选择
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • $.ajax,axios,fetch三种ajax请求的区别
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (4.10~4.16)
  • (C++哈希表01)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (LeetCode C++)盛最多水的容器
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (算法)硬币问题
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 反射的使用
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET的数据绑定
  • .Net中wcf服务生成及调用
  • .考试倒计时43天!来提分啦!
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • [ 转载 ] SharePoint 资料