对不起 我实在想不出来除了一个一个试以外的方法。但看答案也是这种 不过加了滑动窗口的方法。
这个窗口一直维持着一个以当前字母开头的最长不重复子串
如图 我们可以发现 从一个字母开始的不重复子串是一直在右移的 那么我们右移多少呢?
我们可以发现 当这里重复时,A向右移至B,C,E,D都只能得到更短的不重复子串,因此我们要移到重复的那个字母的右边。
比如下图 我们遇到D重复了 就把窗口移到D的右边 。
思路有了 下面是代码 。我的思路是用一个字典来维持窗口。 但后来发现困难很大 。
击败了双90 、、。 本来想用一个字典维持滑动窗口 后来发现 很困难 因为窗口改变时还要删除。 所以字典只用来记录最后出现的位置。
```python class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ pos = {} #创建一个记录重复字母出现位置的字典。 low = 0 high = 0 maxlen = 0 while high<len(s): while high<len(s): if s[high] not in s[low:high] : #这句话不能上提到循环判断 否则会越界访问 pos[s[high]] = high high += 1 else: break length = high - low #记录当前窗口长度并与最大比较 if length > maxlen: maxlen = length if high<len(s): #如果不是因为遍历完了 说明出现了重复 就把窗口挪动到重复字母的下一个。 low = pos[s[high]]+1 return maxlen ```