LeetCode 3.无重复字符的最长子串(python)

第一次写博客,单纯想做一下错题记录

题目描述:给定一个字符串 s ,找出其中不含有重复字符的最长子串的长度

 提示:字符串长度    0 \leq s.length \leq 5* 10^{^{4}}  , s 由英文字母、数字、符号、空格组成

身为代码菜鸡,一开始只想到暴力法求解,穷举所有出现的子串,挨个判断,在测试用例长度不大时,勉强能够过,但一旦测试用例过长,绝对超出时间限制

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if len(s)<2:
            return len(s)
        max = 0
        for i in range(len(s)):
            for j in range(i+1,len(s)+1):
                chs = list(s[i:j])
                if len(set(chs))==len(chs) and len(chs)>max:
                    max = len(chs)
        return max

之后看了大佬的题解,有了收获,通过这篇博客记录下来,积累错题 

采用滑动窗口的思路,滑动窗口实际是一个队列

假设 s = "acbcddef"时,

当进入窗口的子串为"abc"时,满足题目要求,此时不重复子串为"acb"

当再进入字符"c"时,窗口内子串变为"acbc",不满足题目要求,此时滑动窗口,将左端"ac"移出,此时不重复子串为"bc"

当再进入字符"d"时,窗口内子串变为"bcd",满足题目要求,此时不重复子串为"bcd"

当再进入字符"d"时,窗口内子串变为"bcdd",不满足题目要求,此时滑动窗口,将左端"cd"移出,此时不重复子串为"d"

当再进入字符"f"时,窗口内子串变为"cde",满足题目要求,此时不重复子串为"cde"

当再进入字符"f"时,窗口内子串变为"cdef",满足题目要求,此时不重复子串为"cdef"

重复上述操作,当新进入窗口字符与原窗口字符有重复时,滑动窗口将左侧元素移出,同时记录每次迭代时当前不重复子串长度,与之前进行比较

具体代码实现:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if len(s)<2:
            return len(s)
        maxlen = 1
        start = 0
        for end in range(1,len(s)):
            if s[end] in s[start:end]:
                start = s[start:end].index(s[end])+1+start
                if end-start+1>maxlen:
                    maxlen = end-start+1
            else:
                if end-start+1>maxlen:
                    maxlen = end-start+1
        return maxlen

 


版权声明:本文为Gillian_cc原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。