一、题目描述
给定一个字符串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、如果哈希表中存储了即将加入滑动窗口的元素,那么需要不断的把窗口左边的元素移除窗口。
5、此时,滑动窗口可以接纳新增元素。
三、参考代码
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
+关注
关注
19文章
2917浏览量
103369 -
字符串
+关注
关注
1文章
554浏览量
20284 -
python
+关注
关注
53文章
4705浏览量
83704
原文标题:LeetCode 3:无重复字符的最长子串
文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论