示例 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 由英文字母、数字、符号和空格组成
这道题可以使用滑动窗口来解决。具体思路如下:
定义一个空的窗口,用两个指针 left 和 right 表示窗口的左右边界,初始化为 0。
用一个哈希表记录窗口中每个字符出现的次数,键为字符,值为该字符在窗口中出现的次数。
当 right 指针小于字符串的长度时,执行以下步骤:
a. 如果当前字符在哈希表中已经存在,说明窗口中出现了重复字符,需要将左边界右移,并且更新哈希表中的值,直到窗口中不再存在重复字符为止。
b. 如果当前字符在哈希表中不存在,说明可以将该字符加入窗口,将 right 指针右移,并且更新哈希表中的值。
c. 在每次更新完哈希表后,记录下当前窗口的大小,取其中的最大值。
返回最大的窗口大小。
func lengthOfLongestSubstring(s string) int {
// 获取字符串长度
n := len(s)
// 建立哈希表记录字符出现的次数
freq := make(map[byte]int)
// 定义双指针
left, right := 0, 0
// 定义最大长度
maxLen := 0
// 当 right 指针小于字符串长度时,循环执行
for right < n {
// 如果当前字符在哈希表中已经存在,则将左指针右移,并更新哈希表中的值
if freq[s[right]] > 0 {
freq[s[left]]--
left++
} else { // 否则将右指针右移,并更新哈希表中的值
freq[s[right]]++
right++
// 计算当前窗口的长度,并取其中的最大值
maxLen = max(maxLen, right-left)
}
}
// 返回最大长度
return maxLen
}
// 定义一个求最大值的函数
func max(a, b int) int {
if a > b {
return a
}
return b
}