天机阁

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

2022-06-29 · 2 min read
LeetCode

题目

给定一个字符串 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 由英文字母、数字、符号和空格组成

题解

这题用滑动窗口的思路来做比较简单。
当 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
}