Skip to content

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

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

md
示例 1:

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

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

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

思路

使用滑动窗口,记录窗口内出现的字符,如果出现重复字符,则将窗口左边界向右移动,直到没有重复字符;

TIP

某大厂面试的算法题就是此题,题目要求是找出最长不重复子串,而非长度;

go
func lengthOfLongestSubstring(s string) int {
    cnt := make(map[rune]int)
    res := ""
    maxLen := 0
    j :=0 

    for i,c := range s {
        if _,ok:=cnt[c];ok{
            cnt[c]++
        }else{
            cnt[c] = 1
        }
        // 收缩
        for cnt[c] >=2 {
            cnt[rune(s[j])]--
            j++
        }

        curLen := i - j + 1
        if curLen > maxLen{
            maxLen = curLen
            res = s[j:i+1]
        }
    }
    return len(res)
}
本站访客数 人次 本站总访问量