题目
思路分析
题目要求:求不含有重复字符的 最长子串 的长度。
这题 我的第一思路就是2层循环
第一层循环,字符串从头开始遍历
第二层循环,计算每一个下标为i的元素开头的最大不连续的字符串 并计算其长度
代码展示
class Solution:
def lengthOfLongestSubstring1(self, s: str) -> int:
max=0
for i in range(len(s)): #第一层循环,字符串从头开始遍历
temp=0
a=[]
while i<len(s): #第二层循环,计算每一个i开头的最大不连续的字符串长度temp
if s[i] in a:
break
else:
a.append(s[i])
temp+=1
i+=1
if temp>max:
max=temp
return max
结果没有通过,超出时间限制
思路分析(改进)
原来的第二层循环 都是把遍历到的当前节点作为结果子串的第一个节点,再次循环
造成大量的时间浪费
通过滑动窗口的思想,进行改进。
- 如果当前节点不在窗口里,窗口右指针向右扩展窗口
- 如果当前节点p在窗口里,窗口左指针向右缩小窗口,一直缩小到把和节点p元素相同的节点排除窗口
- 全局max记录最大值长度
代码展示(改进)
def lengthOfLongestSubstring2(self, s: str) -> int:
max=0
a=[] #作为 滑动窗口
for i in range(len(s)):
if s[i] not in a:
a.append(s[i])
# print("yes1",s[i],i,a)
else:
a.append(s[i])
j=0
while j<len(a): #滑动窗口出现重复 前面的元素不断删除
if a[j]!=s[i]:
del a[0]
else:
del a[0]
break
# print("yes2",s[i],i,a)
if len(a)>max:
max=len(a)
i+=1
return max
#########################################################
def lengthOfLongestSubstring3(self, s: str) -> int:
maxlen=0
temp=''
for i in s:
if i not in temp: #如果当前节点不在窗口里,窗口右指针向右扩展窗口
temp+=i
maxlen=max(maxlen,len(temp))
else: #如果当前节点p在窗口里,窗口左指针向右缩小窗口,一直缩小到把和节点p元素相同的节点排除窗口
temp=temp[temp.index(i)+1:]
temp+=i
return maxlen