题目
给定一个字符串 s s s ,请你找出其中不含有重复字符的最长子串的长度。
示例
- 输入:
s
=
"
a
b
c
a
b
c
b
b
"
s = "abcabcbb"
s="abcabcbb"
输出: 3 3 3
解释: 因为无重复字符的最长子串是 " a b c " "abc" "abc",所以其长度为 3 3 3。 - 输入:
s
=
"
b
b
b
b
b
"
s = "bbbbb"
s="bbbbb"
输出: 1 1 1
解释: 因为无重复字符的最长子串是 " b " "b" "b",所以其长度为 1 1 1。
思路
滑动窗口
滑动窗口
什么是滑动窗口?
其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!
如何移动?
我们只要把队列的左边的元素移出就行了,直到满足题目要求!
一直维持这样的队列,找出队列出现最长的长度时候,求出解!
- 首先是比较容易理解的做法。大概思路就是将连续不重复的放入一个列表,计算它的长度;如果遍历到和列表中元素重复的,将列表清空,从该字符开始,再将连续不重复的放入到这个列表中,和之前的列表长度进行比较,选取数值最大的。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s: return 0
if len(s) == 1: return 1
n = len(s)
res = []
cur = ""
# 如果字符不在新创建的列表中,存入该列表
for i in range(n):
if s[i] not in cur:
cur += s[i]
count = len(cur)
# 将长度存到数组中
res.append(count)
# 如果在,将列表清空,再将新的连续不重复字符放进列表中
else:
while s[i] in cur:
# 逐个将列表中的字符清空
cur = cur[1:i]
# 从重复的字符开始 重新加入列表中
cur += s[i]
return max(res)
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
l = []
n = len(s)
res = 0
# 开始遍历
for i in range(n):
# 如果字符不在新创建的列表中,存入该列表
if s[i] not in l:
l.append(s[i])
# 和前面的列表长度进行比较,取大值
res = max(len(l), res)
# 如果在,将列表清空,再将新的连续不重复字符放进列表中
else:
while s[i] in l:
# 逐个将列表中的字符清空
l.pop(0)
# 从重复的字符开始 重新加入列表中
l.append(s[i])
return res
- 比较简洁的写法
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
l = []
n = len(s)
res = 0
# 开始遍历
for i in range(n):
# 因为右侧会一直进入字符
while s[i] in l:
# 逐个将列表中的字符清空
l.pop(0)
l.append(s[i])
res = max(len(l), res)
return res