给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
难度:🌟🌟🌟
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
这题用滑动窗口的思路来做比较简单。
当 window[c] 值大于1时,说明窗口存在重复字符,不符合条件,就该移动 left 缩小窗口了。
另外,要在收缩窗口完成后更新 res, 因为窗口收缩的循环条件是存在重复元素,换句话说,收缩完成后一定要保证窗口没有重复。
func lengthOfLongestSubstring(s string) int {
window := make(map[byte]int)
left, right := 0, 0
res := 0 // 记录结果
n := len(s)
for right < n {
c := s[right]
right++
// 更新窗口数据
window[c]++
for window[c] > 1 {
d := s[left]
left++
window[d]--
}
res = max(res, right-left)
}
return res
}
func max(a, b int) int {
if a > b {
return a
}
return b
}