一、题设
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
二、基本思路(窗口滑动法)
1.定义左右指针锁定窗口大小,当窗口中没有重复元素时,right指针一直往后移动直至有重复元素,之后确定窗口大小(右下标-左下标),左下标往后移动一格为下次循环做准备。
2.已经遍历过的元素记录用字典记录,也是由此判断是否有重复元素的依据。
三、代码实现
def lengthOfLongestSubstring(self, s):
left = 0 #左指针
right = 0 #右指针
max = 0 #记录最大滑动区间
span = dict() #字典存储待判断的数据
while right <len(s) : #right到底结束
x = s[right] #x即为a
#dict.setdefault()表示如果键不存在于字典中,则添加;
#如果存在,则无视;
span.setdefault(x,0)
span[x] += 1
#往后移动一位
right += 1
while span[x] > 1:
#找到与当前指针相同的元素
#保存到y中
y = s[left]
#i动
left += 1
#更新字典中的数量,保持没有重复
span[y] -= 1
#计算当前的长度
lenth = right - left
#比较
if lenth > max:
max = lenth
return max
四、效率总结
n方的效率值,遍历的躺数比暴力解少了很多,所谓的窗口滑动其实也就是数据结构中的模式串匹配,如果觉得理解的还不是很到位可以去翻阅一下。明天见~