题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
答案
这个问题可以使用滑动窗口算法来解决。
首先,我们定义一个变量 max_len
来记录最长子串的长度,并初始化为 0。
然后,我们定义一个集合 char_set
来记录当前窗口内出现的字符,并初始化为空集。
接下来,我们使用一个指针 left
来表示当前窗口的左边界,初始化为 0。
然后,我们使用一个指针 right
来表示当前窗口的右边界,初始化为 0。
在每次循环中,我们将 right
向右移动一位,并将当前字符加入到 char_set
中。
如果当前字符已经在 char_set
中出现过,说明当前窗口内存在重复字符,我们需要将 left
向右移动一位,并更新 char_set
和 max_len
。
最后,我们返回 max_len
即可。
以下是 Python 代码实现:
def lengthOfLongestSubstring(s: str) -> int:max_len = 0 # 最长子串的长度char_set = set() # 当前窗口内出现的字符集合left = 0 # 当前窗口的左边界right = 0 # 当前窗口的右边界while right < len(s):if s[right] in char_set:char_set.remove(s[left])left += 1char_set.add(s[right])max_len = max(max_len, right - left + 1)right += 1return max_len