此题算法为:滑动窗口
原理如下: 窗口中始终是无重复字母的字符串。 我们通过窗口的左界和右界控制窗口。 右界不用特意操作,因为它是+1,+1地涨上去,记得在循环里+1就好。 左界:每当有一个字符曾经出现过,就需要判断左界。 重点来了: 若被判断的字符上一次出现的位置就在滑动窗口内,即 [ i,j ] 内, 则需要left改变位置,改变为该字符上次出现位置+1。 例如: abcdb中,窗口正常运行到abcd时,下一个字符为b,b上一次出现在实在窗口里,所以需要把left设置为上一次出现的位置+1的位置,得到新的窗口为cdb,不然你不这样设置,窗口里有重复的字符(bcdb),不符合窗口的定义。
from collections import Counter
def lstr(s: str)-> int:
ans =0
cnt = Counter()
left = 0
for right, c in enumerate(s):
cnt[c]+=1
while cnt[c]> 1: #cnt[c]> 1,就代表 c 这个字符有两个,就需要将窗口移动到c上次出现的位置+1
cnt[s[left]]-= 1 #只要cnt[c]> 1,就将窗口中最左边的元素移出窗口,直到重复的字符被移出去为止
left +=1 #只要cnt[c]> 1,就将窗口的左边界left右移,直到重复的字符被移出去为止
ans= max(ans,right-left +1)
return ans
s=input()
print(lstr(s))