无重复字符的最长子串
难度:⭐⭐⭐ 面试超高频
考点
- 滑动窗口
- 哈希表记录字符出现
- 字节面试超高频题
题目描述
给定一个字符串 s,请找出其中不含有重复字符的最长子串的长度。
函数签名
go
func lengthOfLongestSubstring(s string) int示例
输入:s = "abcabcbb"
输出:3("abc")
输入:s = "bbbbb"
输出:1("b")
输入:s = "pwwkew"
输出:3("wke")
输入:s = ""
输出:0要求
- 时间复杂度 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
}