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

2024-06-19 02:12
文章标签 重复 最长 字符 子串

本文主要是介绍【无重复字符的最长子串】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

无重复字符的最长字串

  • 一、题目
  • 二、解决方法
    • 1.暴力解法
    • 2.滑动窗口+哈希
  • 三、总结
    • 1.es6 new set()的用法
      • 添加元素add()
      • 删除元素delete()
      • 判断元素是否存在has
    • 2.滑动窗口和双指针的联系和特点

一、题目

在这里插入图片描述

二、解决方法

1.暴力解法

在这里插入图片描述
解题思路:使用两层循环逐个生成子字符串,再利用es6 new set()去重判断是否有重复字符,若无则比较最大值和不重复字符串长度的大小重新给max_length赋值
在这里插入图片描述

2.滑动窗口+哈希

在这里插入图片描述

在这里插入图片描述
解题步骤和思路:
初始化一个空集合 subSet,用于存储当前窗口中的字符。
初始化右指针 r 为 0,表示窗口的右边界初始位置。
初始化 max_length 为 0,用于记录最长子串的长度。
使用一个循环来移动左指针 i,从 0 到 s.length - 1。
如果 i 不等于 0,说明左指针已经移动过,需要从 subSet 中移除上一个窗口的左边界字符 s.charAt(i-1)。
使用一个内部循环来移动右指针 r,从当前位置开始向右移动,直到 r 达到字符串的末尾或者遇到了一个在 subSet 中已经存在的字符。
在内部循环中,每次移动右指针之前,检查 s.charAt® 是否已经在 subSet 中。如果不在,就将它添加到 subSet 中,并更新 max_length 为当前窗口大小 r - i 和 max_length 中的较大值。
当左指针 i 完成遍历后,max_length 就是最长的不含有重复字符的子串的长度。

这个算法的时间复杂度是 O(n),其中 n 是字符串 s 的长度。尽管有两个嵌套循环,但是每个字符最多被访问两次(一次由左指针 i 引起,一次由右指针 r 引起),因此整体时间复杂度是线性的。

三、总结

1.es6 new set()的用法

常用于数组去重、用于字符串去重、实现并集、交集、和差集

添加元素add()

删除元素delete()

判断元素是否存在has

……其他用法具体可见http://t.csdnimg.cn/WrM6i

在JavaScript中,Set 是一种集合数据结构,它存储唯一值,并允许快速检查一个值是否在集合中。这种特性使得 Set 非常适合用作哈希集合,用于记录字符是否出现过。

Set 在内部使用哈希表来实现,这提供了一种非常高效的方式来添加、删除和检查元素是否存在。在处理字符串问题时,比如查找无重复字符的最长子串,使用 Set 可以快速判断一个字符是否已经在当前的子串窗口中出现过。

2.滑动窗口和双指针的联系和特点

在这里插入图片描述

滑动窗口通常用于解决子数组或子字符串相关的问题,它涉及到一个窗口的左右边界(指针),这个窗口可以在数组或字符串上滑动。滑动窗口的大小可以固定也可以动态变化。

滑动窗口的使用特点:

适用于寻找连续的子数组或子字符串。
窗口的左右边界随着算法的执行而移动。
通常用于需要维护窗口内元素状态的问题。
可以用来解决最大最小问题,如最长子串、最小覆盖子串等。
双指针: 双指针是一种更通用的技术,它可以用于解决多种数组或字符串问题。双指针可以是同向移动、相向移动或背向移动,具体取决于问题的性质。

双指针的使用特点:

适用于配对问题,如两数之和、三数之和等。
可以用于排序数组,快速定位满足条件的元素对。
在某些情况下,双指针可以用来替代滑动窗口,如寻找最长子串时。
双指针可以用于链表问题,如检测循环、找到中间点等。

这篇关于【无重复字符的最长子串】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073713

相关文章

浅析python如何去掉字符串中最后一个字符

《浅析python如何去掉字符串中最后一个字符》在Python中,字符串是不可变对象,因此无法直接修改原字符串,但可以通过生成新字符串的方式去掉最后一个字符,本文整理了三种高效方法,希望对大家有所帮助... 目录方法1:切片操作(最推荐)方法2:长度计算索引方法3:拼接剩余字符(不推荐,仅作演示)关键注意事

自定义注解SpringBoot防重复提交AOP方法详解

《自定义注解SpringBoot防重复提交AOP方法详解》该文章描述了一个防止重复提交的流程,通过HttpServletRequest对象获取请求信息,生成唯一标识,使用Redis分布式锁判断请求是否... 目录防重复提交流程引入依赖properties配置自定义注解切面Redis工具类controller

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Java中字符编码问题的解决方法详解

《Java中字符编码问题的解决方法详解》在日常Java开发中,字符编码问题是一个非常常见却又特别容易踩坑的地方,这篇文章就带你一步一步看清楚字符编码的来龙去脉,并结合可运行的代码,看看如何在Java项... 目录前言背景:为什么会出现编码问题常见场景分析控制台输出乱码文件读写乱码数据库存取乱码解决方案统一使

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例