题目
描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例1
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例4
输入: s = ""
输出: 0
提示
(1)0 <= s.length <= 5 * 104
(2)s
由英文字母、数字、符号和空格组成
解题思路
(1)对输入的s = "" 进行输出0
>>>s = ""
>>>if not s:
... print(0)
0
(2)定义集合lookup,对输入字符串从左向右进行检索
(3)对于不包含在set中出现的元素,添加到set中,并记录当前set的长度cur_len
(4)对于包含在set中的元素,采用先进先出原则,剔除左边的元素,直到set中不含有该元素,最后将该元素加进set中,并记录当前set的长度cur_len
(5)每一次循环输入字符串的字符,如果当前set的长度cur_len大于历史记录的最大长度max_len,则将cur_len赋值给max_len
(6)遍历字符串后输出最终的max_len
代码
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
lookup.add(s[i])
return max_len