第一次写博客,单纯想做一下错题记录
题目描述:给定一个字符串 s ,找出其中不含有重复字符的最长子串的长度

提示:字符串长度 , 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版权协议,转载请附上原文出处链接和本声明。