题目:无重复字符串

from collections import defaultdict
s="abcabcbb"
n=len(s)
lookup = defaultdict(int)
start = 0
end = 0
max_len = 0
counter = 0
while end < len(s):
    if lookup[s[end]] > 0:
        counter += 1
    lookup[s[end]] += 1
    end += 1
    while counter > 0:
        if lookup[s[start]] > 1:
            counter -= 1
        lookup[s[start]] -= 1
        start += 1
    max_len = max(max_len, end - start)

print (max_len)

使用 int 作为 default_factory 可以方便地实现计数器功能:

from collections import defaultdict

s = "mississippi"
d = defaultdict(int)
for k in s:
d[k] += 1
print(d) # 输出: defaultdict(<class 'int'>, {'m': 1, 'i': 4, 's': 4, 'p': 2})

知道该技巧后,我们来看循环结构

while end < len(s):
    if lookup[s[end]] > 0:
        counter += 1
    lookup[s[end]] += 1
    end += 1
    while counter > 0:
        if lookup[s[start]] > 1:
            counter -= 1
        lookup[s[start]] -= 1
        start += 1
    max_len = max(max_len, end - start)

在最外层循环中,我们利用 default_factory设立了字典并快速的对end所遍历的字母进行统计

再碰到重复字母时利用计数器counter方便后续窗口的移动

counter大于0时,即我们遇到了重复子串,根据题意需要移动并于当前最长字串进行比较

看向第二层循环,我们移动左边的指针start来寻找有重复的字母并剔除字母

最后用max比较出最长子串

题目出自利扣