# python 无重复字符的最长子串

```代码：
PythonC++Java
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:return 0
left = 0
lookup = set()
n = len(s)
max_len = 0
cur_len = 0
for i in range(n):
cur_len += 1
while s[i] in lookup:
lookup.remove(s[left])
left += 1
cur_len -= 1
if cur_len > max_len:max_len = cur_len
return max_len
下面介绍关于滑动窗口的万能模板,可以解决相关问题,相信一定可以对滑动窗口有一定了解!```

3. 无重复字符的最长子串

class Solution:     def lengthOfLongestSubstring(self, s):         """         :type s: str         :rtype: int         """         from collections import defaultdict         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)         return max_len 76. 最小覆盖子串

class Solution:     def minWindow(self, s: 'str', t: 'str') -> 'str':         from collections import defaultdict         lookup = defaultdict(int)         for c in t:             lookup[c] += 1         start = 0         end = 0         min_len = float("inf")         counter = len(t)         res = ""         while end < len(s):             if lookup[s[end]] > 0:                 counter -= 1             lookup[s[end]] -= 1             end += 1             while counter == 0:                 if min_len > end - start:                     min_len = end - start                     res = s[start:end]                 if lookup[s[start]] == 0:                     counter += 1                 lookup[s[start]] += 1                 start += 1         return res 159. 至多包含两个不同字符的最长子串

class Solution:     def lengthOfLongestSubstringTwoDistinct(self, s: str) -> int:         from collections import defaultdict         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 > 2:                 if lookup[s[start]] == 1:                     counter -= 1                 lookup[s[start]] -= 1                 start += 1             max_len = max(max_len, end - start)         return max_len 340. 至多包含 K 个不同字符的最长子串

class Solution:     def lengthOfLongestSubstringKDistinct(self, s: str, k: int) -> int:         from collections import defaultdict         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 > k:                 if lookup[s[start]] == 1:                     counter -= 1                 lookup[s[start]] -= 1                 start += 1             max_len = max(max_len, end - start)         return max_len 滑动窗口题目:

3. 无重复字符的最长子串

30. 串联所有单词的子串

76. 最小覆盖子串

159. 至多包含两个不同字符的最长子串

209. 长度最小的子数组

239. 滑动窗口最大值

567. 字符串的排列

632. 最小区间

727. 最小窗口子序列

46 踩 查看 12 条回复 回复 陈志伟 5 个月前 class Solution { public:     int lengthOfLongestSubstring(string s) {         if(s.size() == 0) return 0;         unordered_set<char> lookup;         int maxStr = 0;         int left = 0;         for(int i = 0; i < s.size(); i++){             while (lookup.find(s[i]) != lookup.end()){                 lookup.erase(s[left]);                 left ++;             }             maxStr = max(maxStr,i-left+1);             lookup.insert(s[i]);     }         return maxStr;     } };

1.对于大多数人比较纠结的一点

while (lookup.find(s[i]) != lookup.end()){                 lookup.erase(s[left]);                 left ++;             } 这段代码结果是不断从左缩小窗口，直到窗口中不存在与下一个字符重复的字符。

lookup.find() 查找对应元素，成功返回对应的迭代器，失败返回最后一个元素迭代器（即 lookup.end() ）

lookup.end() 大多数人认为是最后添加进去的元素对应的迭代器，其实不然，是最后添加进去的元素对应的迭代器的下一个（最后一个元素对应的迭代器），此处有点绕，大家可以去找找相关资料，就很清晰了。

2.小白刚开始刷力扣，其实刷了三题，发现一个规律，最初的算法思想很多都是来自遍历过程。也就是所谓的暴力算法，但是由于哈希和一些高级数据结构的操作，实现了查询时间复杂度为常数的方法，进而衍生出优化方法（这是小白自我感觉，无论对错，希望得到老哥们的指点）

24 踩 回复 评论(75) echooj 20 天前 为什么用set, 我尝试改变了成数组，依旧能够通过：

```class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:return 0
left = 0
lookup = []
n = len(s)
max_len = 0
cur_len = 0
for i in range(n):
cur_len += 1
while s[i] in lookup:
lookup.remove(s[left])
left += 1
cur_len -= 1
if cur_len > max_len:max_len = cur_len
lookup.append(s[i])
return max_len```

0 条评论

• ### java ping命令

简洁的网络测试工具，图形化显示网络状态。 当你需要测试网络情况时，此工具可以帮助你来进行测试。 你可以简单的输入ip地址或者域名来获得本机到达目标地址的网络...

• ### cssjshtml vue.js v-for 过滤并排序

vue.js computed 利用逗号实现 vue.js 先排序再过滤，关键点在于:顺序不能为先过滤再排序。

• ### No.003 Longest Substring Without Repeating Characters

Longest Substring Without Repeating Characters Total Accepted: 167158 Total Subm...

• ### memlock过低导致的数据库性能问题(r6笔记第10天)

今天在一台备库机器上准备搭建active data guard ，在主库上做配置的时候，发现主库的反应有些慢，主要的感觉就是敲命令的时候似乎都有些停顿。 带着疑...

• ### 文件拷贝工具 原

WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能就是在本地与远程计算机间安全的复制文件。.winsc...

• ### 使用ipmi调节r410的风扇转速

说真的，家里有太服务器真的是很吵的事情，而且因为是冬天，室温就够降低很多温度了，但是r410主板上bios能设置的最低转速声音还是很大，没办法只能使用ipmi去...

• ### vue-cli的项目结构

这篇文章对纯新手友好，所以有过任何vue开发经验的人可以出门左转啦！这篇文章献给我的homie苏蕾儿童鞋，让她在学习vue项目的时候少走一点弯路（径直冲向末路哈...

• ### 使用ipmi调节r410的风扇转速

说真的，家里有太服务器真的是很吵的事情，而且因为是冬天，室温就够降低很多温度了，但是r410主板上bios能设置的最低转速声音还是很大，没办法只能使用ipmi去...