题目描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
提示
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
解题思路
解题思路:滑动窗口 + 双指针
设置双指针, left
指向窗口的左端, right
指向窗口的右端的下一个元素,窗口的大小为 right - left
。首先,设置 left=0
, right=1
,固定 left
,不断移动 right
,直到 right
指向的元素在当前窗口中已存在,然后,找到该元素在窗口中的位置,并将头指针指向该位置的下一个位置;或者 right
移动到了边界外,此时比较 max_str
与 right - left
的大小,返回最大子串。
python实现
class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ length = len(s) # 即长度为0或1,len(s)即为最长子串 if length < 2: return length # 初始化left,right两个指针 left, right = 0, 1 # 最长长度设置为1 max_str = 1 # 退出条件,right到达边界 while right < length: # 当right未到达边界,且right指向的元素没有出现在子串中 while right < length and s[right] not in s[left: right]: # right指针右移 right += 1 max_str = max(max_str, right - left) # 当right未到达边界 if right != length: # 将left指针移动到重复元素的下一个位置 left += s[left: right].index(s[right]) + 1 return max_str 复制代码
今日打卡完成,目前进度 7/200。