3. 无重复字符的最长子串
题目描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
解决方案:
方法一:滑动窗口
题目要求从给定字符串s
中找出不包含重复字符的最长子串的长度
由于子串是连续的,可以想到采用滑动窗口解决该问题。
思路如下:
采用双指针
i
与j
作为滑动窗口的左端点与右端点,初始值为0采用哈希表记录已经遍历过的字符。其
key
为字符本身,value
为当前字符对应的下标设
maxLen
为不包含重复字符的最长子串的长度从头到尾遍历字符串
s
- 判断哈希表是否存储当前字符
c
若哈希表已存储当前字符
c
需要收缩滑动窗口,即更新滑动窗口左端点
i
的位置此时,左端点
i
有两种选择,第一种为保持i
不变,第二种为将其更新为哈希表中当前字符c
对应的下标再加1如果当前滑动窗口不包含当前字符
c
但哈希表中却存储着c
,则需要选择第一种更新方案。例如abba
字符串。如果当前滑动窗口包含当前字符
c
,则需要选择第二种更新方案。例如abca
字符串。
. 为综合以上两种更新方案,左端点
i
更新时区二者最大值即可。
更新哈希表
比较当前滑动窗口长度与
maxLen
的大小,并为maxLen
赋值滑动窗口向右滑动,
j
自增
- 判断哈希表是否存储当前字符
Python3
|
|
Java
|
|
Encouragement
目前就读于新加坡国立大学,转码菜鸡一枚。
决心通过日更一篇题解激励自己坚持刷题,坚持学习算法。
这是我搭建Leetcode-Everyday仓库后发布の第6篇题解,欢迎各位star并提出Issue~
点击这里,进入我的个人Leetcode主页~