算法&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)操作。

发布了13 篇原创文章 · 获赞 2 · 访问量 943

猜你喜欢

转载自blog.csdn.net/chengduxiu/article/details/104385189