leetcode3.题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
![](https://img-blog.csdnimg.cn/20200503011753691.png)
解题思路:
1.暴力解法:首先把所有子串列出来,两层for循环就可解决这个问题,然后判断每个子串里有没有重复的字符,如果有去掉即可,然后对剩下的子串返回最大长度就可以。比较简单,这里就不给出代码了。
2.滑动窗口,其实做这道题,脑子里大概有个这么个思路,但是不知道这个方法就可以滑动窗口算法呀。
其实想法很简单,就是用一个快指针fast和满指针slow来维护一个窗口,窗口里的内容需要符合没有重复元素的要求,然后用这个滑动窗口大小就是来表示当前不重复元素的大小,并不断移动fast指针,增大当前窗口的范围。需要注意以下几个问题:
(1)在左移fast指针的时候,也就是新的fast所指向的元素,和新增前的窗口里的元素,有重复时,怎么做?也就是以下图的情况(盗图哈,自己花有点麻烦,start也就是我说的slow,end就是fast)
![](https://img-blog.csdnimg.cn/20200503012847824.png)
![](https://img-blog.csdnimg.cn/20200503013320126.png)
m
a
x
(
m
a
x
s
i
z
e
,
c
u
r
r
e
n
t
s
i
z
e
)
max(maxsize,currentsize)
max(maxsize,currentsize)
(3)另外就是边界值的判定,对于长度为0和长度为1的字符串直接返回其长度就可以。
代码如下:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
#判定边界值
if not s:return 0
if len(s)==1:return 1
#蠢初始化快慢指针,初始窗口大小为0
slow = 0
fast = 0
#定义初始最大窗口
maxsize = 0
while (fast < (len(s) - 1)):
#不对对fast指针进行加1,直到为最后一个值时
fast += 1
#判断当前的窗口时候符合条件,如何不符合,则按上述(1)中调整slow指针
if s[fast] in s[slow:fast]:
idx = s[slow:fast].index(s[fast])
idx+=slow
slow = idx + 1
#每次更新当前窗口大小
currentsize = fast - slow + 1
#和最大窗口比较,更新最大值
if currentsize > maxsize:
maxsize = currentsize
return maxsize
这题还可以用字典来优化,以下是运行结果:
![](https://img-blog.csdnimg.cn/20200503014247118.png)