LeetCode 3.无重复字符的最长子串(中等)

96 阅读1分钟

题目描述

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。

 

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

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