leetcode3. 无重复字符的最长子串

leetcode3.题目描述

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

leetcode3. 无重复字符的最长子串_第1张图片

解题思路:
1.暴力解法:首先把所有子串列出来,两层for循环就可解决这个问题,然后判断每个子串里有没有重复的字符,如果有去掉即可,然后对剩下的子串返回最大长度就可以。比较简单,这里就不给出代码了。
2.滑动窗口,其实做这道题,脑子里大概有个这么个思路,但是不知道这个方法就可以滑动窗口算法呀。
  其实想法很简单,就是用一个快指针fast和满指针slow来维护一个窗口,窗口里的内容需要符合没有重复元素的要求,然后用这个滑动窗口大小就是来表示当前不重复元素的大小,并不断移动fast指针,增大当前窗口的范围。需要注意以下几个问题:

  (1)在左移fast指针的时候,也就是新的fast所指向的元素,和新增前的窗口里的元素,有重复时,怎么做?也就是以下图的情况(盗图哈,自己花有点麻烦,start也就是我说的slow,end就是fast)

leetcode3. 无重复字符的最长子串_第2张图片
  可以看出end指向b时候,新的窗口显然不满足,没有重复元素的条件了,这个时候我们需要更新start指针了,start指针需要更新到和元素b重复的索引下面,也是指向c的位置了
leetcode3. 无重复字符的最长子串_第3张图片
(2)怎么在动态的过程中,保存最大的滑动窗口,因为滑动窗口的大小一直改变,其实这很简单,用一个maxsize来保存最大值,然后currentsize表示当前窗口大小,每次移动都更新一次,并且使用

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

  这题还可以用字典来优化,以下是运行结果:

leetcode3. 无重复字符的最长子串_第4张图片

你可能感兴趣的:(Leetcode,字符串,python)