无重复字符的最长子串
问题
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
一、示例
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
二、解题思路
通过集合来解
利用集合中无重复元素的性质,可以设定一个“滑动窗口”。
首先设定一个空集合,遍历字符串中的每个元素,判断元素是否在集合中。
由于集合一开始为空,所以前面两步基本在往集合中添加元素。一旦检索到字符串中的元素已经出现在集合中,则剔出集合中的元素,也就是“滑动窗口的”长度开始伸缩,当字符串遍历结束后,就可以找到“滑动窗口”的最大长度。
class Solution(object):
def lengthOfLongestSubstring(self, s):
if s == '': return 0
occ = set()
left = 0
max_len = 0
cur_len = 0
for i in range(len(s)):
cur_len += 1
while s[i] in occ:
occ.remove(s[left])
cur_len -= 1
left += 1
occ.add(s[i])
if cur_len > max_len: max_len = cur_len
return max_len
下一题 寻找两个正序数组的中位数