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

题目描述

思路
这道题目是 CodeTop 排名第一的面试题,我也确实在面试的时候曾被要求手撕这道题目😅,所以掌握这道题目还是非常有必要的。
我们需要使用滑动窗口来解决这道题目,并使用双指针来设置滑动窗口的区间。具体来说,我们设置两个变量slow和fast,用于指向字符串对应字符的数组的下标。我们主要移动fast指针,让它向后对整个字符串进行遍历,在此之前设置一个字典mp用于统计fast所遍历过的字符的数量。
如果mp[s[fast]] > 1,则说明当前slow <-> fast区间当中s[fast]这个字符出现了超过一次,也就是出现了重复,这种情况下我们就需要对窗口内的字符进行去重。去重的手段其实也很简单,就是不断地向右移动slow指针,并让mp[s[slow]] --,也就是从字典当中减去一次左指针所指向字符的出现次数。
以上工作是在一次遍历的过程中完成的,完成之后我们只需要在当前 epoch 结束之前向右移动fast指针即可。在移动右指针之前,我们使用ans变量来统计一次滑动窗口的最大长度,最终返回ans即可得到答案。
基于以上思路,我们写代码来解决问题。
Golang 题解
go
func lengthOfLongestSubstring(s string) int {
n := len(s)
mp := map[byte]int{}
ans := 0
for slow, fast := 0, 0; fast < n; fast ++ {
mp[s[fast]] ++
if mp[s[fast]] > 1 {
for slow < fast && mp[s[fast]] > 1 {
mp[s[slow]] --
slow ++
}
}
ans = max(ans, fast - slow + 1)
}
return ans
}
Python 题解
python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n, slow, fast, ans = len(s), 0, 0, 0
mp = {}
while fast < n:
if s[fast] not in mp:
mp[s[fast]] = 0
mp[s[fast]] += 1
if mp[s[fast]] > 1:
while slow < fast and mp[s[fast]] > 1:
mp[s[slow]] -= 1
slow += 1
ans = max(ans, fast - slow + 1)
fast += 1
return ans