老师的示例代码中 r 下标会先判断是否超出数组长度,但是一旦超出会转而去增加l下标。我的理解是一旦r到达边界(r+1超出)是循环已经可以退出,因为不会再有更长的substring了。而且r+1超出时,如果转而去增加l ,后面还会去做一次 res=max(res, r-l+1), 这个似乎是多余的,而且逻辑上也不对(虽然不会影响最终结果)
我是这样实现的:
class Solution(object):
def lengthOfLongestSubstring(self, s):
if not s or len(s) ==0:
return 0
l=0
r=-1
ssize = len(s)
charmap = [0 for i in range(128)]
maxlen = 0
while l<ssize:
if r+1 >= ssize:
break
if charmap[ord(s[r+1])]==0:
charmap[ord(s[r+1])]+=1
r+=1
maxlen = max(maxlen, r-l+1)
else:
while l<ssize and charmap[ord(s[r+1])]>0:
charmap[ord(s[l])]-=1
l+=1
return maxlen
顺便问一下对于滑动窗口的迭代,老师似乎都喜欢用左下标l 来作为循环判断条件,这个是有什么好处么(比如边界处理), 我一般习惯于用r 下标是否到边来控制循环结束。
谢谢