题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
提示:
0 <= s.length <= 5 * 104s由英文字母、数字、符号和空格组成
Tips:
- 双指针法,left记录子串第一个字符位置,right记录子串最后一个字符位置
- 每次循环right+=1,如果遇到重复的,就更新left的位置,否则将s[r]位置字符放到map中
- 需要注意left更新到left=mp[s[r]]+1的位置
Code:
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
if s=="":
return 0
l=0
r=0
mp={}
mp[s[r]]=r
ans=1
while 1:
r+=1
if r>=len(s):
ans=max(ans,r-l)
break
if s[r] in mp:
ans=max(ans,r-l)
tmp=l
l=mp[s[r]]+1
for i in range(tmp,mp[s[r]]+1):
del mp[s[i]]
mp[s[r]]=r
return ans
end