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

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

相关文章

MySQL中查找重复值的实现

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

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

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

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

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

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

SQL常用操作精华之复制表、跨库查询、删除重复数据

《SQL常用操作精华之复制表、跨库查询、删除重复数据》:本文主要介绍SQL常用操作精华之复制表、跨库查询、删除重复数据,这些SQL操作涵盖了数据库开发中最常用的技术点,包括表操作、数据查询、数据管... 目录SQL常用操作精华总结表结构与数据操作高级查询技巧SQL常用操作精华总结表结构与数据操作复制表结

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j