第三题:最长子串

对不起  我实在想不出来除了一个一个试以外的方法。但看答案也是这种  不过加了滑动窗口的方法。

这个窗口一直维持着一个以当前字母开头的最长不重复子串

第三题:最长子串

 

如图  我们可以发现 从一个字母开始的不重复子串是一直在右移的    那么我们右移多少呢?

第三题:最长子串

 

我们可以发现  当这里重复时,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
```

 


 

 

上一篇:LeetCode: 167. 两数之和 II - 输入有序数组


下一篇:数据结构与算法 排序(一)