0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解无重复字符的最长子串

算法与数据结构 来源:吴师兄学算法 作者:吴师兄 2022-09-06 11:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、题目描述

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

0 <= s.length <= 5 * 10^4

s由英文字母、数字、符号和空格组成

二、题目解析

很经典的滑动窗口的题目。

具体操作如下:

1、定义需要维护的变量,对于此题来说,要求是最大长度,同时又涉及去重,因此需要一个哈希表。

2、定义窗口的首尾端 (start, end), 然后滑动窗口。

3、窗口的右端位置从 0 开始,可以一直移动到尾部。

4、如果哈希表中存储了即将加入滑动窗口的元素,那么需要不断的把窗口左边的元素移除窗口。

d82ffca6-2d92-11ed-ba43-dac502259ad0.pngd8437a56-2d92-11ed-ba43-dac502259ad0.png

5、此时,滑动窗口可以接纳新增元素。

d854e980-2d92-11ed-ba43-dac502259ad0.png

三、参考代码

1、Java 代码

//登录AlgoMooc官网获取更多算法图解
//https://www.algomooc.com
//作者:程序员吴师兄
//代码有看不懂的地方一定要私聊咨询吴师兄呀
//无重复字符的最长子串(LeetCode 3):https://leetcode.cn/problems/longest-substring-without-repeating-characters/
classSolution{
publicintlengthOfLongestSubstring(Strings){

//滑动窗口模板化解题,五步走策略

//【1、定义需要维护的变量】

//对于此题来说,要求是最大长度
intmaxLen=0;

//同时又涉及去重,因此需要一个哈希表
HashSethash=newHashSet();

//【2、定义窗口的首尾端(start,end),然后滑动窗口】

//窗口的左端位置从0开始
intstart=0;

//窗口的右端位置从0开始,可以一直移动到尾部
for(intend=0;end< s.length() ; end++ ){

            // 【3、更新需要维护的变量, 有的变量需要一个 if 语句来维护 (比如最大最小长度)】

            // 【4、如果题目的窗口长度可变: 这个时候一般涉及到窗口是否合法的问题】
            //  如果当前窗口不合法时, 用一个 while 去不断移动窗口左指针, 从而剔除非法元素直到窗口再次合法

            // 如果哈希表中存储了即将加入滑动窗口的元素
            while(hash.contains(s.charAt(end))){
                
                // 那么需要不断的把窗口左边的元素移除窗口

                // 把 s.charAt(start) 移除记录
                hash.remove(s.charAt(start));

                // 窗口左端向右移动
                start++;
            }

            // 此时,滑动窗口可以接纳 s.charAt(end)
            hash.add(s.charAt(end));

            // 维护变量 maxLen
            maxLen = Math.max(maxLen,end - start + 1);

        }

        // 【5、返回所需要的答案】
        return maxLen;

    }
}

2、C++ 代码

classSolution{
public:
intlengthOfLongestSubstring(strings){

//滑动窗口模板化解题,五步走策略

//【1、定义需要维护的变量】

//对于此题来说,要求是最大长度
intmaxLen=0;

//同时又涉及去重,因此需要一个哈希表
unordered_sethash;

//【2、定义窗口的首尾端(start,end),然后滑动窗口】

//窗口的左端位置从0开始
intstart=0;

//窗口的右端位置从0开始,可以一直移动到尾部
for(intend=0;end< s.length() ; end++ ){

            // 【3、更新需要维护的变量, 有的变量需要一个 if 语句来维护 (比如最大最小长度)】

            // 【4、如果题目的窗口长度可变: 这个时候一般涉及到窗口是否合法的问题】
            //  如果当前窗口不合法时, 用一个 while 去不断移动窗口左指针, 从而剔除非法元素直到窗口再次合法

            // 如果哈希表中存储了即将加入滑动窗口的元素
            while(hash.count(s[end])){
                
                // 那么需要不断的把窗口左边的元素移除窗口

                // 把 s.charAt(start) 移除记录
                hash.erase(s[start]);

                // 窗口左端向右移动
                start++;
            }

            // 此时,滑动窗口可以接纳 s.charAt(end)
            hash.insert(s[end]);

            // 维护变量 maxLen
            maxLen = max(maxLen,end - start + 1);

        }

        // 【5、返回所需要的答案】
        return maxLen;

    }
};

3、Python 代码

classSolution:
deflengthOfLongestSubstring(self,s:str)->int:
#滑动窗口模板化解题,五步走策略

#【1、定义需要维护的变量】

#对于此题来说,要求是最大长度
maxLen=0

#同时又涉及去重,因此需要一个哈希表
hash=set()

#【2、定义窗口的首尾端(start,end),然后滑动窗口】

#窗口的左端位置从0开始
start=0

#窗口的右端位置从0开始,可以一直移动到尾部
forendinrange(len(s)):

#【3、更新需要维护的变量,有的变量需要一个if语句来维护(比如最大最小长度)】

#【4、如果题目的窗口长度可变:这个时候一般涉及到窗口是否合法的问题】
#如果当前窗口不合法时,用一个while去不断移动窗口左指针,从而剔除非法元素直到窗口再次合法

#如果哈希表中存储了即将加入滑动窗口的元素
whiles[end]inhash:

#那么需要不断的把窗口左边的元素移除窗口

#把s.charAt(start)移除记录
hash.remove(s[start])

#窗口左端向右移动
start+=1

#此时,滑动窗口可以接纳s.charAt(end)
hash.add(s[end])

#维护变量maxLen
maxLen=max(maxLen,end-start+1)

#【5、返回所需要的答案】
returnmaxLen

四、复杂度分析

时间复杂度:O(N),其中 N是字符串的长度。左指针和右指针分别会遍历整个字符串一次。

空间复杂度:O(∣Σ∣),其中 Σ 表示字符集(即字符串中可以出现的字符),∣Σ∣ 表示字符集的大小。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115683
  • 字符串
    +关注

    关注

    1

    文章

    594

    浏览量

    23044
  • python
    +关注

    关注

    57

    文章

    4858

    浏览量

    89586

原文标题:LeetCode 3:无重复字符的最长子串

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    精密平台中重复精度的影响因素有哪些

    什么是重复定位精度?     在精密运动平台中,重复定位精度(或重复性)是指运动台多次运动到同一名义位置时,与实际位置偏差的某个统计量,根据不同的测试标准会有不同的统计计算方法,例如峰谷值、2σ、3
    的头像 发表于 10-15 11:24 380次阅读
    精密平台中<b class='flag-5'>重复</b>精度的影响因素有哪些

    非对称密钥生成和转换规格详解

    当前章节将说明系统目前支持的算法及其对应的规格。密钥生成有两种指定规格的方式,分别是: 字符串参数:以字符串的形式描述开发者需要生成的密钥规格。 密钥参数:使用密钥的详细密码学信息,构造密钥对象
    发表于 09-01 07:50

    LM3466 多 LED 电流平衡器技术手册

    到电源的数或每个 LED 的正向电压 字符串。 如果任何 LED 灯在运行过程中打开,LM3466 会自动平衡通过所有剩余活动 LED 灯的电源电流。 如 因此,即使一些 LED
    的头像 发表于 08-29 14:27 854次阅读
    LM3466 多<b class='flag-5'>串</b> LED 电流平衡器技术手册

    labview如何生成一个带字符串返回的dll

    labview如何生成一个dll,如下图,要求一个输入,类型是字符串,返回类型也是字符串
    发表于 08-28 23:20

    在Python中字符串逆序有几种方式,代码是什么

    对于一个给定的字符串,逆序输出,这个任务对于python来说是一种很简单的操作,毕竟强大的列表和字符串处理的一些列函数足以应付这些问题 了,今天总结了一下python中对于字符串的逆序输出的几种常用
    的头像 发表于 08-28 14:44 784次阅读

    linux系统awk特殊字符命令详解

    在Linux系统中,awk 是一种非常强大的文本处理工具,能够对文本数据进行分析、格式化和筛选。利用其内置的特殊字符和操作符,用户可以实现复杂的数据处理任务。以下对一些常见的awk特殊字符和操作符
    的头像 发表于 07-28 16:38 422次阅读

    harmony-utils之StrUtil,字符串工具类

    harmony-utils之StrUtil,字符串工具类 harmony-utils 简介与说明 [harmony-utils] 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类
    的头像 发表于 07-03 11:32 369次阅读

    STM32C031C6使用的是UART2通讯,通过printf()函数发送字符串时,汉字错码怎么解决?

    使用的是UART2通讯,通过printf()函数发送字符串时,汉字错码(见下图),应该是KEIL哪里没有设置好的问题。 启用了UART2的中断接收,可以接收到串口调试助手的数据,但是缓存区的指针没有归零,下次接收时缓存区中的内容接续(如下图所示),不知道用什么命令来清除缓存区(即让指针归零)。
    发表于 03-07 12:30

    请问如何用Verilog实现将ascaii码数值字符串转换成定点数?

    我需要接收一个ascaii码字符串,内容是12位有效数字的数值,带小数。我不知道怎么把小数部分转换成定点数。
    发表于 01-23 21:57

    字符串在数据库中的存储方式

    数据库是现代信息技术中存储和管理数据的核心组件。字符串作为最常见的数据类型之一,在数据库中的存储方式对其性能和可扩展性有着重要影响。 数据类型 固定长度字符串 :如CHAR类型,它为每个字符串分配
    的头像 发表于 01-07 15:41 1252次阅读

    字符串在编程中的应用实例

    字符串在编程中有着广泛的应用,它们被用于表示文本数据、处理用户输入、构建动态内容等。以下是一些字符串在编程中的应用实例: 1. 用户输入与输出 用户输入 :程序通常需要从用户那里获取输入,这些输入通
    的头像 发表于 01-07 15:33 1131次阅读

    字符串字符数组的区别

    在编程语言中,字符串字符数组是两种基本的数据结构,它们都用于存储和处理文本数据。尽管它们在功能上有一定的重叠,但在内部表示、操作方式和使用场景上存在显著差异。 1. 内部表示 字符串 字符串
    的头像 发表于 01-07 15:29 1678次阅读

    字符串反转的实现方式

    在编程中,字符串反转是一个基础而重要的操作,它涉及到将一个字符串中的字符顺序颠倒过来。这个操作在多种编程语言中都有不同的实现方式,本文将探讨几种常见的字符串反转方法。 1. 递归方法
    的头像 发表于 01-07 15:27 1244次阅读

    字符串处理方法 字符串转数字的实现

    在编程中,将字符串转换为数字是一个常见的需求。不同的编程语言有不同的方法来实现这一功能。以下是一些常见编程语言中的字符串转数字的实现方法: Python 在Python中,可以使用内置的 int
    的头像 发表于 01-07 15:26 1399次阅读

    Linux grep命令详解

    Linux grep命令是一种非常常用的文本搜索工具,它可以在给定的文件中搜索匹配的字符串,并输出匹配的行。grep是全称“global search regular expression print”,可以识别正则表达式,并使用正则表达式进行搜索。
    的头像 发表于 12-25 09:39 1789次阅读