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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
func lengthOfLongestSubstring(s string) int {
hm := map[byte]int{}
l := len(s)
// 右指针,初始值为-1,代表还未移动
rk, ans := -1, 0
// i 作为左指针
for i:=0; i<l; i++ {
if i != 0 {
// 左指针移动,移除一个字符
// 注意移除的是前一个字符
delete(hm, s[i-1])
}
for rk+1<l && hm[s[rk+1]] == 0 {
// 移动右指针,且记录字符数++
hm[s[rk+1]]++
rk++
}
// 第 i 到 rk 个字符是极长的无重复字符的子串
ans = max(ans, rk-i+1)
}
return ans
}

func max(a, b int) int {
if a > b {
return a
}
return b
}