3.无重复最长子串

52 阅读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 由英文字母、数字、符号和空格组成

思路

1、使用双指针扫描 left->right 区间

2、使用 map 记录已经扫描过的字符

3、如果遍历到 right 时,发现该字符已经处理过了,那么说明 [left, right) 是合法的无重复子串

4、如果是最长无重复子串更新之

优化:使用固定长度数组代替性能相对较差的 map

代码 1

func lengthOfLongestSubstring(s string) int {
    var l, r, n, ans int
    l, r, n = 0, 0, len(s)
    m := map[byte]int{}
    
    for r < n {
        if j, ok := m[s[r]]; ok {
            l = max(l, j+1)
        }
        ans = max(ans, r-l+1)
        m[s[r]] = r
        r++
    }

    return ans
}

why l = max(l, j+1)

image.png

状态转移图

image.png

代码 2

func lengthOfLongestSubstring(s string) int {
    var bitMap [256]bool
    var l, r, n, ans int
    n = len(s)

    for r < n {
        for l < r && bitMap[s[r]] {
            bitMap[s[l]] = false 
            l++
        }
        ans = max(ans, r-l+1)
        bitMap[s[r]] = true
        r++
    }   

    return ans
}

图示

image.png