无重复字符的最长子串

349 阅读1分钟

题目描述

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

该题是leetcode 的第三题。

思路

滑动窗口:

  • 开始左右两边一样,从左到右遍历,也就是窗口右端右移;
  • 判断是否含有重复字符,不含有,修改最大值,继续右移;
  • 含有的话,窗口左端右移,注意,这里左端右移可能为1,2,... right位;

代码实现

func lengthOfLongestSubstring(s string) int {
    if len(s) == 1 {
        return 1
    }

    left := 0
    right := 0
    var res int
    // mchar map用于计数,因为是字符串,所以key为byte类型
    // 含有重复的字符,那么mchar[key]>1
    mchar := make(map[byte]int)

    for ; right < len(s); right++ {
        mchar[s[right]]++

        // mchar[s[right]] > 1 ;含有重复字符,需要调整窗口左端右移
        for mchar[s[right]] > 1 {
            mchar[s[left]]--
            left++
        }
        
        // 修改最大值
        if res < right - left +1 {
            res = right - left + 1
        }
    }

    return res
}