
一、题目给定一个字符串s请你找出其中不含有重复字符的最长子串的长度。示例 1:输入:s abcabcbb输出:3解释:因为无重复字符的最长子串是 abc所以其长度为 3。注意 bca 和 cab 也是正确答案。示例 2:输入:s bbbbb输出:1解释:因为无重复字符的最长子串是 b所以其长度为 1。示例 3:输入:s pwwkew输出:3解释:因为无重复字符的最长子串是 wke所以其长度为 3。请注意你的答案必须是子串的长度pwke是一个子序列不是子串。二、解答实现注意本题中子串还是必须要连续的不连续的只能算是子序列。暴力方法很好想直接两轮循环遍历到一个字符第二个循环遍历剩下的字符把所有的连续字串求出来保存好长度取最大值即可但是这样做肯定会超过时间。我们继续观察首先题目中提到“不重复”可能会用到哈希表来去重。子串的遍历可以使用滑动窗口的思路但是本题的滑动窗口与其他的情况不大一样类似于滑动窗口最大值借助双端队列那个题目我们可以这样把窗口看作是一个动态的窗口大小不确定并且是一个集合set。窗口有左右边界左边界left先固定是第0个位置然后去遍历右边界把左边界元素放进窗口集合右边界如果不在这个集合里面就把右边界对应的元素添加进窗口相反如果右边界元素在窗口中就把左边界元素弹出然后左边界变成下一个元素。据此我们可以写出如下代码class Solution: def lengthOfLongestSubstring(self, s: str) - int: window set() # 设置窗口 left 0 # 左边界 ans 0 # 保存答案 for right in range(len(s)): # 遍历右边界 while s[right] in window: # 这里如果使用if如果窗口中是“aaab”这种情况就没法把a都排除干净 window.remove(s[left]) left 1 window.add(s[right]) # 把右边界元素添加到窗口中 ans max(ans, right - left 1) return ans