【专题:滑动窗口】【LeetCode】3. 无重复字符的最长子串

212 阅读1分钟

无重复字符的最长子串

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

示例1

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

示例2

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

示例3

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

思路

  • 子串,需要保证的是连续性,为了保证连续性,因此在本题中使用滑动窗口来维持“一段连续的子串”。在本题,“不包含重复字符的”,则考虑到使用map。因此,本题使用滑动窗口+map的方法。
  • 滑动窗口:相当于是一个队列,当队列最右边元素(right指针指向的元素)的map=1,说明,最左边的元素(left指针指向的元素)和最右边的元素(right)是相同的,则移动left指针,直到两边的元素不同。
  • 使用一个常量维持最长字串长度。

解法

func lengthOfLongestSubstring(s string) int {
    left,right:=0,0
    maxValue:=0
    hashMap:=map[byte]int{}
    for right<len(s){ 
        _,ok:=hashMap[s[right]]
        if !ok{
            hashMap[s[right]]++ // left和right指向不同的元素,则right右移
            right++
        }else{
            delete(hashMap,s[left]) // 如果left和right均指向相同的元素,则删除left指向的元素
            left++ // left右移
        }
        maxValue=max(maxValue,right-left) // 保存最长的无重复子串长度
    }
    return maxValue
}
func max(a,b int)int{
    if a>b{
        return a
    }
    return b
}

总结

  • “无重复”可考虑map。
  • “最长无重复子串”可考虑滑动窗口。