Skip to content

无重复字符的最长子串 ​

难度:⭐⭐⭐ 面试超高频 ​

考点 ​

  • 滑动窗口
  • 哈希表记录字符出现
  • 字节面试超高频题

题目描述 ​

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

函数签名 ​

go
func lengthOfLongestSubstring(s string) int

示例 ​

输入:s = "abcabcbb"
输出:3("abc")

输入:s = "bbbbb"
输出:1("b")

输入:s = "pwwkew"
输出:3("wke")

输入:s = ""
输出:0

要求 ​

  1. 时间复杂度 O(n),空间复杂度 O(字符集大小)

提示 ​

  • 右指针扩张,左指针在出现重复时收缩
  • 用 map 记录窗口内每个字符的出现次数
  • 当某字符计数 > 1 时,左指针向右移动直到消除重复

参考答案(Go) ​

点击展开参考答案
go
//go:build ignore

package answer

func lengthOfLongestSubstring(s string) int {
	window := make(map[byte]int) // 字符 -> 窗口内出现次数
	left := 0
	result := 0
	for right := 0; right < len(s); right++ {
		c := s[right]
		window[c]++
		for window[c] > 1 {
			d := s[left]
			window[d]--
			left++
		}
		if right-left+1 > result {
			result = right - left + 1
		}
	}
	return result
}

持续学习,持续构建。