给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""输出: 0
提示:
需要注意一个点: left < idx +1 为什么要这么写呢?如果不加会怎样呢?
例如 "abba"
- 当
right = 2时, 这时候window里存在这个值,然后把 left 赋值成 上一次出现位置的下一个节点, 也就是 2。当前长度是right - left + 1即 1 - 当
right = 3时,这时候window里存在这个值,然后把 left 赋值成 上一次出现位置的下一个节点,也就是 1。当前长度是right - left + 1即 3, 显然这时候是不对的。func lengthOfLongestSubstring(s string) int {left, right := 0, 0// key 字符 val 最后一次出现的位置window := make(map[byte]int)n := len(s)res := 0for right < n {cur := s[right]// "abba"if idx, ok := window[cur]; ok && left < idx+1 {left = idx + 1}window[cur] = rightif res < right-left+1 {res = right - left + 1}right++}return res}
