3. 无重复字符的最长子串

66 阅读1分钟

3. 无重复字符的最长子串

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

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

示例 2:

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

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
提示:
  • 0 <= s.length <= 5 * 10 4
  • s 由英文字母、数字、符号和空格组成
代码
知识点:滑动窗口
def lengthOfLongestSubstring( s ) :
    n = len(s)
    '''
    # 1.使用队列
    i = 0 # 指向串首
    j = 0 # 指向串尾巴
    w = collections.deque() # 无重复子串窗口,使用队列
    ans = 0
    while j < n:
        while w and s[j] in w:
            w.popleft() # 不断删除第一个进队的直到窗口里子串不重复
            i += 1
        w.append(s[j])
        ans = max(ans , j - i + 1) # 无重复,取值
        j += 1 # 扩展窗口

    return ans
    '''
    # 2. 使用hash表
    i = 0
    j = 0
    d = set() # 使用hash表要快的多
    ans = 0
    while j < n:
        while s[j] in d:
            d.remove(s[i])
            i += 1
        d.add(s[j])
        ans = max(ans , j - i + 1) # 无重复,取值
        j += 1 # 扩展窗口

    return ans