算法&Leetcode|滑窗算法&3.无重复字符的最长子串

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

 

示例 1:

 

输入: "abcabcbb"

输出: 3 

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

示例 2:

 

输入: "bbbbb"

输出: 1

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

示例 3:

 

输入: "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

 


 

解答&思路

 

这里主要涉及的是滑窗算法。

 

滑动窗口初听觉得抽象模糊,但就像描述的那样,可以理解成是一个会滑动的窗口,每次记录下窗口的状态,再找出符合条件的适合的窗口。

 

就好比一个人拿着一个卷尺测字符串,要在里面找出最长且没有重复字符的子串,在上面不停地缩拉测量,记录下卷尺达到的最大长度即可。

 

子串就是这个卷尺的伸出部分,即一个窗口,左边缩进,右边拉出

 

因为不能有重复的字符,在右端逐渐拉长的过程中,每新增加的一个新字符都要拿来和左侧子串中的字符做对比

 


 

代码

 

我的PY代码:

class Solution:    def lengthOfLongestSubstring(self, s: str) -> int:        if(len(s)==0):            return 0         left = 0        window = set()        n = len(s)        maxl = 0        nowl = 0        for i in range(n):            nowl += 1            while s[i] in window:                window.remove(s[left])                left += 1                nowl -= 1            if(nowl>maxl):                maxl = nowl            window.add(s[i])        return maxl

 

 

排名第一的PY代码:

class Solution:    def lengthOfLongestSubstring(self, s):        dicts = {}        maxlength = start = 0        for i,value in enumerate(s):            if value in dicts:                tmp_start = dicts[value] + 1                if start < tmp_start:                    start = tmp_start                                dicts[value] = i                        num = i + 1 - start            if maxlength < num :                 maxlength = num                            return maxlength

 

果然香还是字典香,毕竟O(1)操作。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章